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

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,提问作者Саша Волотко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:36:03