asm中的内存寻址

时间:2009-10-31 21:19:27

标签: assembly x86 gas

我正在学习asm,这是我(很多)问题之一: 我想更改数组的某个索引的值。 让我们说:

  • %eax包含我的新值
  • 堆栈的顶部(即(0)%esp)包含数组的索引
  • -4(%ebp)包含数组的地址。

我已经尝试了movl %eax, (-4(%ebp),0(%esp),4)但它没有用。 更糟糕的是,它会抛出语法错误:bobi.s:15:错误:垃圾邮件`(%ebp),0(%esp),4)'表达式后

正确的语法是什么?

1 个答案:

答案 0 :(得分:5)

在x86程序集中没有单一指令可以执行此操作。您必须找到一个可用的寄存器,用它来存储从-4(%ebp)获得的数组的地址,找到另一个寄存器来保存索引0(%esp),然后才能访问该寄存器你感兴趣的单元格(在更多类似RISC的程序集中,你仍然需要在进行内存访问之前将这两个寄存器加在一起)。

假设寄存器可用,例如:

movl -4(%ebp), %ebx
movl 0(%esp), %ecx
movl %eax, 0(%ebx,%ecx,4)

应该有用。