You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:53:27