Division of two numbers in NASM

时间:2017-08-04 12:07:32

标签: assembly x86 nasm integer-division

Starting to teach myself assembly (NASM) I wanted to know how to divide 2 numbers (For instance on Windows).

My code looks like this but it crashes.

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

I wonder what's really wrong? It doesn't even display the value after the division.

2 个答案:

答案 0 :(得分:5)

您的指令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),则会发生除以零错误。< / p>

这可以解释为什么你的程序崩溃:因为在执行edx指令之前没有设置寄存器div,它可能包含一个如此大的值,所得到的商不会#39} ; t适合eax寄存器。

答案 1 :(得分:-2)

其他评论和答案解释了正确使用div,但他们没有解释为什么你的代码崩溃而不是打印错误的结果。在大多数汇编程序中,&#34;推送消息&#34;推送消息的前4个字节而不是消息的地址,这是printf所期望的。在NASM,就我所知,它推动了地址。但你应该仔细检查,因为我不使用NASM。