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
相关产品推荐
相关产品推荐

