Assembly 汇编语言数学函数:
由于某些原因,这实际上不会进入我的其他功能,如减法、除法等。当我将我的数字输入程序时,它会接受这些数字,并只打印出我存储在系统中的第一个数字。我可能需要修正我的控制结构也许?这应该是一个简单的计算器,需要两个数字和一个符号,并给出一个答案。我的另一个问题是,在我输入两个数字后,打印“=”号的最佳方式是什么。 谢谢Assembly 汇编语言数学函数:,assembly,nasm,Assembly,Nasm,由于某些原因,这实际上不会进入我的其他功能,如减法、除法等。当我将我的数字输入程序时,它会接受这些数字,并只打印出我存储在系统中的第一个数字。我可能需要修正我的控制结构也许?这应该是一个简单的计算器,需要两个数字和一个符号,并给出一个答案。我的另一个问题是,在我输入两个数字后,打印“=”号的最佳方式是什么。 谢谢 segment .data segment .bss num1: resb 4 num2: resb 4 button: resb 2 segment .text glob
segment .data
segment .bss
num1: resb 4
num2: resb 4
button: resb 2
segment .text
global asm_main
asm_main:
push ebp
mov ebp, esp
; ********** CODE STARTS HERE **********
call read_int
mov DWORD[num1], eax
call read_char
mov DWORD[button], edx
call read_char
call read_int
mov DWORD[num2], ebx
cmp DWORD[button], '+'
je addition
cmp DWORD[button], '-'
je subtraction
cmp DWORD[button], '*'
je multiplication
cmp DWORD[button], '/'
je division
cmp DWORD[button], '%'
jle modulus
addition:
mov eax, DWORD[num1]
add eax, DWORD[num2]
call print_int
call print_nl
jmp end
subtraction:
mov eax, DWORD[num2]
mov eax, DWORD[num1]
call print_int
call print_nl
jmp end
multiplication:
mov eax, DWORD[num1]
mov ebx, DWORD[num2]
mul ebx
call print_int
call print_nl
jmp end
division:
mov eax, DWORD[num1]
mov ebx, DWORD[num2]
mov edx, 0
div edx
jmp end
modulus:
mov eax, DWORD[num1]
mov ebx, DWORD[num2]
call print_int
call print_nl
jmp end
您仍在将DWORD存储到
按钮中,在该按钮中只保留2个字节的空间(一个字,而不是双字)。IDK为什么要多于1个字节,或者为什么要将其存储在内存中而不是寄存器中……虽然代码存在一些不一致性,但它应该仍然可以正常工作:在第二次调用read_int
后,值从EBX
传递:mov-DWORD[num2],EBX
,但是在您的第一次调用中,它是从EAX
传递的。那么read_int
是否返回EAX
或EBX
中的值呢?其中一个可能是错误的。Paul Carter的过程read\u int
,read\u char
在EAX
中返回结果。另外,mov-DWORD[button],edx
必须位于第二个mov-DWORD[button],edx
之后(将edx
更改为EAX
之后)。在jle之后,模数
应该是jmp端
。将按钮:resb 2
更改为按钮:resb 4
。还有其他的问题,但是有了这些更改,程序应该运行。@JayvonJackson:不一定。如果您链接CRT启动代码或任何其他对象文件,并且这些文件将任何内容放入.bss
中,则它们的功能可能会使用按钮+2
中的字节,因为链接器会将.bss
部分与您静态链接的所有内容合并。甚至可能用read\u char