Kar*_*ren 6 x86 assembly nasm integer-division
开始自学组装(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
Run Code Online (Sandbox Code Playgroud)
我想知道什么是真的错了?它甚至不显示除法后的值.
您的指令通过提供的源操作数(即:除数)div ebx划分寄存器对 edx:eax(该指令的隐式操作数).
mov edx, 0
mov eax, 250
mov ecx, 25
div ecx
Run Code Online (Sandbox Code Playgroud)
在上面的代码中edx:eax是股息并且ecx是除数.执行div指令后,寄存器eax包含商并edx包含余数.
我使用寄存器ecx而不是ebx持有除数,因为如评论中所述,寄存器ebx必须在调用之间保留.否则,在从相应的子程序返回之前,必须在修改和恢复之前正确保存.
如一条评论中所述,如果商不符合商寄存器的范围(eax在这种情况下),则会发生除以零的错误.
这可以解释为什么程序崩溃:由于寄存器edx在执行div指令之前没有被设置,它可能包含一个如此大的值,结果商不适合eax寄存器.