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