format pe console
include 'C:\Program Files\FASM\INCLUDE\win32ax.inc'
include 'C:\Program Files\FASM\INCLUDE\api\kernel32.inc'
entry start
.data
Num1 dd 0 ;Первое
Num2 dd 0 ;Второе число
Act db 0 ;Операция
.code
start: cinvoke printf, <'It is console calculator%c+ addition%c- subtraction%c* multiplication%c/ devision%c%c'>, 10, 10, 10, 10, 10, 10
begin:
cinvoke printf, <'First number: '> ;Ввод пользователем чисел и операции
cinvoke scanf, <'%d'>, Num1
cinvoke printf, <'Second number: '>
cinvoke scanf, <'%d'>, Num2
cinvoke printf, <'Operation: '>
cinvoke scanf, <'%s'>, Act
cmp byte [Act], '+' ;Проверка на сложение
jne notAdd ;Если не сложение, то перейти в notAdd
mov eax, dword [Num1] ;Сложение
add eax, dword [Num2]
cinvoke printf, <'Result: %d'>, eax ;Вывод результата
cinvoke getch
cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
jmp begin ;Переход в начало
notAdd: cmp byte [Act], '-' ;Проверка на вычитание
jne notSub ;Если не вычитание, то перейти в notSub
mov eax, dword [Num1] ;Вычитание
sub eax, dword [Num2]
cinvoke printf, <'Result: %d'>, eax ;Вывод результата
cinvoke getch
cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
jmp begin ;Переход в начало
notSub: cmp byte [Act], '*' ;Проверка на умножение
jne notMul ;Если не умножение, то перейти в notMul
mov eax, dword [Num1] ;Умножение
imul dword [Num2]
cinvoke printf, <'Result: %d'>, eax ;Вывод результата
cinvoke getch
cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
jmp begin ;Переход в начало
notMul: cmp byte [Act], '/' ;Проверка на деление
jne notDiv ;Если не деление, то перейти в notDiv
cmp dword [Num2], 0 ;Проверка на деление на ноль
je divisionByZero ;Если деление на ноль, то перейти в divisionByZero
mov eax, dword [Num1] ;Деление
idiv dword [Num2]
cinvoke printf, <'Result: %d'>, eax ;Вывод результата
cinvoke getch
cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
jmp begin ;Переход в начало
notDiv: cinvoke printf, <'Invailid operation'>
cinvoke getch
cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
jmp begin ;Переход в начало
divisionByZero: cinvoke printf, <'Infinity'>
cinvoke getch
cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
jmp begin ;Переход в начало
section '.idata' import data readable
library kernel32,'kernel32.dll',msvcrt,'msvcrt.dll'
import msvcrt, printf, 'printf', getch, '_getch', scanf, 'scanf'
我写了一个计算器,其中输入了 2 个数字和一个动作。首先,它检查是否需要添加数字。如果动作不是加法,则检查是否需要减去数字。然后是乘法和除法。如果不是除法,则显示动作不正确的信息。我有两个问题:
1 如果你乘以大数,那么答案是错误的。结果分为两半,一个写入edx,另一个写入eax。我不知道如何连接它们。
2 如果除以 0 以外的任何数字,则应用程序崩溃。
EAX
,而是在一对EDX:EAX
中。因此,您需要制定一条规则,在指令之前DIV
始终清除EDX
=xor edx,edx
。在输出处,我们在寄存器EAX
中得到一个整数,以及EDX
除法的余数。乘法运算时,结果也是在pairEDX:EAX
中,而这pair 只能以HEX 的形式输出,也可以由同一个FPU 输出。这是一个例子: