在NASM中划分两个数字

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)

我想知道什么是真的错了?它甚至不显示除法后的值.

眠りネ*_*ネロク 6

您的指令通过提供的源操作数(即:除数)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寄存器.