Windows x64平台NASM汇编器IDIV指令执行异常问题
问题解决:64位NASM汇编IDIV指令结果异常
核心错误原因
你在64位有符号除法中犯了关键错误:使用idiv rcx(64位操作数)时,被除数是RDX:RAX组成的128位有符号整数。你用xor rdx, rdx清零RDX,导致RDX:RAX组合成超大正数(而非预期的-15),最终除法结果完全偏离预期:
- RAX中
-15的64位二进制表示为0xFFFFFFFFFFFFFFF1 - 清零RDX后,RDX:RAX变为
0x0000000000000000FFFFFFFFFFFFFFF1,这是约1.8e19的正数,除以7的结果自然不是预期的-2
另外你尝试的cbq/cbw指令不适用当前场景:这些是针对8位/16位寄存器的符号扩展指令,无法处理64位RAX的符号扩展需求。
修复方法
将xor rdx, rdx替换为cqo指令。cqo的作用是把RAX的符号位扩展到RDX,正好生成64位除法所需的128位有符号被除数。
修正后的代码
bits 64 default rel section .data quotientMsg db "The quotient is: %d", 0 remainderMsg db "The remainder is: %d", 0 section .bss remainder resd 1 section .text extern printf global main extern _CRT_INIT main: push rbp mov rbp, rsp sub rsp, 32 call _CRT_INIT ; Perform signed division mov rax, -15 mov rcx, 7 cqo ; 符号扩展RAX到RDX,生成128位被除数RDX:RAX idiv rcx ; Store the remainder in a reserved space mov dword [remainder], edx ; Print the quotient mov rcx, quotientMsg mov edx, eax call printf ; Print the remainder mov rcx, remainderMsg mov edx, dword [remainder] call printf ; Exit the program xor eax, eax ret
补充说明
- 修正后,RAX会得到预期的商
-2,RDX得到余数1 - 你使用的是Windows x64调用约定(存在
_CRT_INIT),printf的参数传递符合规范:第一个格式串在RCX,第二个整数参数在RDX,无需额外调整
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

