开始自学汇编 (NASM),我想知道如何除 2 个数字(例如在 Windows 上)。
我的代码看起来像这样,但它崩溃了。
global _main
extern _printf
section .text
_main:
mov eax, 250
mov ebx, 25
div ebx
push ebx
push message
call _printf
add esp , 8
ret
message db "Value is = %d", 10 , 0
我想知道到底出了什么问题?它甚至不显示除法后的值。
最佳答案
您的指令 div ebx
除寄存器对 edx:eax
(这是一个隐式操作数)指令)通过提供的源操作数(即:除数)。
mov edx, 0
mov eax, 250
mov ecx, 25
div ecx
在上面的代码中,edx:eax
是被除数,ecx
是除数。
执行div
指令后,寄存器eax
包含商,edx
包含余数>.
我使用寄存器ecx
而不是ebx
来保存除数,因为,如stated in the comments ,寄存器 ebx 必须在调用之间保留。否则,在修改之前必须正确保存,并在从相应的子例程返回之前恢复。
除以零可能会出现错误
如stated in one comment ,如果商不符合商寄存器的范围(本例中为 eax),则会发生除零错误。
这可以解释为什么你的程序崩溃:由于寄存器edx
在执行div
指令之前没有被设置,它可能包含一个非常大的值,以至于结果商不适合 eax
寄存器。
关于assembly - NASM 中的两个数字相除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45506439/