Калькулятор на Си с ассемблерными вставками - 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;
}
}

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

  1. В начале программы объявлены переменные: char plus='+',minus='-',umn='*',delit='/',s[260]; int d; float FIRST,SECOND,RESULT;
  2. Далее программа предлагает пользователю ввести два числа и операцию, которую он хочет выполнить, и сохраняет введенные значения в переменные FIRST, SECOND и s соответственно.
  3. Затем следует ассемблерный блок кода, который выполняет операции сложения, вычитания, умножения и деления в зависимости от введенного пользователем символа.
  4. Если пользователь ввел символ +, выполняется операция сложения.
  5. Если пользователь ввел символ -, выполняется операция вычитания.
  6. Если пользователь ввел символ *, выполняется операция умножения.
  7. Если пользователь ввел символ /, выполняется операция деления.
  8. Если введенный символ не равен ни одному из вышеперечисленных, выводится сообщение об ошибке.
  9. После выполнения ассемблерного блока кода следует фрагмент на языке C, который выводит результат на экран.
  10. В конце программы пользователю предлагается нажать любую клавишу для выхода из программы.

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

11   голосов , оценка 3.273 из 5
Похожие ответы