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.
答案 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。