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

NASM数组排序汇编代码编译报错,寻求解决方法

解决NASM 64位汇编中的地址大小错误

错误原因

你遇到的第24行编译错误,是因为在64位模式下混合使用了32位寄存器(eax)和64位基址寄存器(rdi)进行内存寻址。NASM不允许这种地址大小不匹配的组合——当用32位寄存器作为索引时,会默认生成32位地址偏移,但基址rdi是64位的,两者无法兼容,因此抛出"Impossible combination of address sizes"和"Invalid effective address"错误。

修复方案

将代码中所有用作数组索引的eax替换为64位寄存器rax,确保寻址时所有参与计算的寄存器都是64位:

global median
section .text
median: 
    xor rax,rax ; Initialize rax to zero
    cmp rsi, 0; 
    jle finish ;
next:
    mov rcx, 0;
    not rcx;

outer:
    inc rcx;
    mov rax, rcx;  ; 替换为64位寄存器rax
    cmp rcx, rsi;
    jl inner;
    cmp rcx, rsi;
    je mid;
    
inner:
    inc rax;  ; 替换为64位寄存器rax
    cmp rax, rsi;  ; 替换为64位寄存器rax
    jge outer;
    mov r10, [rdi+rcx*8];
    mov r11, [rdi+rax*8];  ; 替换为64位寄存器rax
    cmp r10, r11;
    jg swap;
    
swap:
    mov r9,r10;
    mov r10,r11;
    mov r11,r9;
    cmp rax, rsi;  ; 替换为64位寄存器rax
    jl inner;
mid:
    mov rax, [rdx];
finish:
    ret

额外功能提示

修复编译错误后,代码还存在逻辑问题需要完善:

  • swap块仅交换了寄存器内的值,未将交换结果写回原数组,排序逻辑不会实际生效,需要添加代码把r10和r11的值存回[rdi+rcx*8]和[rdi+rax*8]。
  • mid块直接读取[rdx]的值,未根据数组长度rsi计算中位数索引并读取对应元素,需补充中位数位置的计算逻辑。

内容的提问来源于stack exchange,提问作者Anish Nethi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:20:52