Калькулятор на Си с ассемблерными вставками - Assembler
Формулировка задачи:
Вот что есть
Нужно это
Сделать в ассемблере, чтобы в си остались только скан и принт
#include "stdafx.h" #include <stdio.h> #include <conio.h> #include <iostream> int main(int argc, char* argv[]) { char plus='+',minus='-',umn='*',delit='/',s[260]; int d; float FIRST=4,SECOND=1,RESULT; /*printf("1="); scanf("%f",&FIRST); printf("\n2="); scanf("%f",&SECOND); printf("\ns=");*/ scanf("%s", &s); if (s[0]==plus) d=43; if (s[0]==minus) d=45; if (s[0]==delit) d=47; if (s[0]==umn) d=42; _asm { mov ecx,'+'; sub ecx, d; jecxz SLOZHENIE; xor ecx,ecx; mov ecx,'-'; sub ecx, d; jecxz VICHITANIE; xor ecx,ecx; mov ecx,'*'; sub ecx, d; jecxz UMNOZHENIE; xor ecx,ecx; mov ecx,'/'; sub ecx, d; jecxz DELENIE; xor ecx,ecx; jmp finishh; 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; finishh: } printf("\n%f\n",RESULT); _getch(); return 0; }
if (s[0]==plus) d=43; if (s[0]==minus) d=45; if (s[0]==delit) d=47; if (s[0]==umn) d=42;
Решение задачи: «Калькулятор на Си с ассемблерными вставками»
textual
Листинг программы
#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; } }
Объяснение кода листинга программы
- В начале программы объявлены переменные: char plus='+',minus='-',umn='*',delit='/',s[260]; int d; float FIRST,SECOND,RESULT;
- Далее программа предлагает пользователю ввести два числа и операцию, которую он хочет выполнить, и сохраняет введенные значения в переменные FIRST, SECOND и s соответственно.
- Затем следует ассемблерный блок кода, который выполняет операции сложения, вычитания, умножения и деления в зависимости от введенного пользователем символа.
- Если пользователь ввел символ
+
, выполняется операция сложения. - Если пользователь ввел символ
-
, выполняется операция вычитания. - Если пользователь ввел символ
*
, выполняется операция умножения. - Если пользователь ввел символ
/
, выполняется операция деления. - Если введенный символ не равен ни одному из вышеперечисленных, выводится сообщение об ошибке.
- После выполнения ассемблерного блока кода следует фрагмент на языке C, который выводит результат на экран.
- В конце программы пользователю предлагается нажать любую клавишу для выхода из программы.