Калькулятор только складывает (си _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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Объявляются переменные: символы операций, числа и результат
- Выводятся приглашения для ввода чисел
- Считываются числа с помощью функции scanf_s
- Получается символ операции с помощью функции getch
- Организуется переход к нужному блоку кода в зависимости от полученной операции
- В блоке SLOZHENIE происходит сложение двух чисел
- В блоке VICHITANIE происходит вычитание двух чисел
- В блоке UMNOZHENIE происходит умножение двух чисел
- В блоке DELENIE происходит деление двух чисел
- В блоке ERROR происходит вывод сообщения об ошибке
- Результат вычисления сохраняется в переменной RESULT
- Выводится результат вычисления
- Запускается бесконечный цикл, ожидающий нажатия клавиши для выхода из программы