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上)。
我的代码看起来像这样,但是崩溃了。
我不知道到底是怎么了?除法后甚至不显示该值。
执行
我使用寄存器
除零错误可能会发生
与stated in one comment一样,如果商不适合商寄存器的范围(在这种情况下为
这可能可以解释您的程序为什么崩溃的原因:由于在执行
(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