NASM数组基址寻址报错:[mas + esi*20]提示无效有效地址错误
问题修复说明
编译报错根因
x86/x86_64架构的硬件寻址规则仅支持变址寄存器搭配1/2/4/8四种缩放因子,你代码中寻址表达式[mas + esi * 20]里的缩放因子20不在支持范围内,因此NASM抛出invalid effective address错误。
其他潜在逻辑错误
- 数组定义错误:你使用
dw定义数组,每个元素为2字节的字类型,5个元素总长度仅为10字节,和你预期的单元素20字节(5个4字节int)不符,需改为dd定义32位int。 - 64位地址运算不规范:64位模式下参与地址计算应使用完整的64位寄存器,避免用32位
esi导致地址截断。 - printf传参错误:你代码中将未赋值的
rdx传给printf的第二个参数,无法正确打印读取到的数值。
修正后代码
extern fprintf extern printf extern stdout section .data mas dd 1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3, 4,4,4,4,4, 5,5,5,5,5, 6,6,6,6,6, 7,7,7,7,7 fmtstr db "%d", 10, 0 section .text global main main: push rbp mov rbp,rsp mov rsi, 2 ; 拆分偏移计算,不写在寻址表达式中 imul rsi, 20 mov eax, [mas + rsi] mov rdi, fmtstr mov rsi, rax mov rax, 0 call printf leave ret
如果需要读取mas[2]中除第一个int外的其他元素,在地址后加对应偏移即可,比如读取第二个int的写法为mov eax, [mas + rsi + 4]。
内容的提问来源于stack exchange,提问作者Саша Волотко
相关产品推荐
相关产品推荐

