Калькулятор только складывает (си _asm) - Assembler

Узнай цену своей работы

Формулировка задачи:

пишу на си с элементами ассемблера, точнее в си только обозначение scanf + printf. т.е. все остальное в ассемблере. уже устал искать ошибку, чтобы не вводил - результат показывает как от сложения
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
 
int main(int argc, char* argv[])
{
    char plus='+',minus='-',umn='*',delit='/',s[260];
    int d;
    float FIRST,SECOND,RESULT;
    
    printf("1=");
    scanf_s("%f",&FIRST);
    
    printf("\n2=");
    scanf_s("%f",&SECOND);
    
    printf("\ns=");
    scanf_s("%s", &s);
    
        _asm
            {
                cmp s,45
                    je VICHITANIE
                cmp s,42
                    je UMNOZHENIE
                cmp s,47
                    je DELENIE
                cmp s,43
                    jne ERROR
//SLOZHENIE:
    fld [SECOND];
    fld [FIRST];
    fadd st,st(1);
    fstp [RESULT];
        jmp finishh;
 
VICHITANIE:
    fld [SECOND];
    fld [FIRST];
    fsub st,st(1);
    fstp [RESULT];
        jmp finishh;
 
UMNOZHENIE:
    fld [SECOND];
    fld [FIRST];
    fmul st,st(1);
    fstp [RESULT];
    jmp finishh;
 
DELENIE:
    fld [SECOND];
    fld [FIRST];
    fdiv st,st(1);
    fstp [RESULT];
        jmp finishh;
 
ERROR:
                }
            
            printf("ERROR");
            
        _asm{
    
    jmp EXIT
 
finishh:
            }
 
printf("\n%f\n",RESULT);
 
        _asm{
 
EXIT:
        
            }
    _getch();
    return 0;
}
буду очень благодарен)

Решение задачи: «Калькулятор только складывает (си _asm)»

textual
Листинг программы
#include "stdafx.h"
#include <stdio.h>
#include <conio.h> 
int main(int argc, char* argv[])
{
    char plus='+',minus='-',umn='*',delit='/';
    int s;
    float FIRST,SECOND,RESULT;
    
    printf("1=");
    scanf_s("%f",&FIRST);    
    printf("\n2=");
    scanf_s("%f",&SECOND);    
    printf("\ns=");
    s=getch();    
        _asm
            {  finit
               fld [SECOND];
               fld [FIRST];
                mov eax,s
                cmp eax,45
                    je VICHITANIE
                cmp eax,42
                    je UMNOZHENIE
                cmp eax,47
                    je DELENIE
                cmp eax,43
                    jne ERROR
SLOZHENIE:
    fadd st,st(1);
        jmp finishh; 
VICHITANIE:    
    fsub st,st(1);    
        jmp finishh; 
UMNOZHENIE:
    fmul st,st(1);
    jmp finishh;
DELENIE:
    fdiv st,st(1);    
        jmp finishh;
ERROR:
                }            
            printf("ERROR");            
        _asm{    
    jmp EXIT    
finishh:
    fstp [RESULT];
            } 
printf("\n%f\n",RESULT); 
      _asm{ 
EXIT:        
            }
    _getch();
    return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Объявляются переменные: символы операций, числа и результат
  3. Выводятся приглашения для ввода чисел
  4. Считываются числа с помощью функции scanf_s
  5. Получается символ операции с помощью функции getch
  6. Организуется переход к нужному блоку кода в зависимости от полученной операции
  7. В блоке SLOZHENIE происходит сложение двух чисел
  8. В блоке VICHITANIE происходит вычитание двух чисел
  9. В блоке UMNOZHENIE происходит умножение двух чисел
  10. В блоке DELENIE происходит деление двух чисел
  11. В блоке ERROR происходит вывод сообщения об ошибке
  12. Результат вычисления сохраняется в переменной RESULT
  13. Выводится результат вычисления
  14. Запускается бесконечный цикл, ожидающий нажатия клавиши для выхода из программы

Оцени полезность:

7   голосов , оценка 4 из 5