assembly - NASM 中的两个数字相除

标签 assembly x86 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

我想知道到底出了什么问题?它甚至不显示除法后的值。

最佳答案

您的指令 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/

相关文章:

c - 32 位处理器上的程序集标签地址不正确

compilation - 在 x86/x64 和 MSIL 中编译之间的关系

assembly - 正确编译多个 asm 文件并将其链接到 .vfd - 对于 Oracle VM?

C++ 和汇编代码 (NASM) 相互调用

assembly - 如何在 assembly 中打印笑脸?

assembly - 这一系列PowerPC指令是做什么的?

assembly - 如何在 x86 汇编编程中表示 FFFFFFBB 等十六进制值?

c - 有助于理解 C 和 C++ 中#define、const 和 enum 在汇编级别上的差异

c - C 中 main 函数的调用约定是什么?

assembly - NASM 特定 - 章节与 [章节]