This question already has answers here:
Dividing in Assembler x86

(4个答案)



Why should EDX be 0 before using the DIV instruction?

(2个答案)


3年前关闭。




我开始自学汇编程序(NASM),我想知道如何将两个数相除(例如在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/

10-13 06:58