Адресация памяти в asm - PullRequest
4 голосов
/ 01 ноября 2009

Я изучаю АСМ, и вот одна из моих (многих) проблем: Я хотел бы изменить значение некоторого индекса массива. Допустим, что:

  • % Eax содержит мое новое значение
  • вершина стека (т. Е. (0)% esp) содержит индекс массива
  • -4 (% ebp) содержит адрес массива.

Я пытался movl %eax, (-4(%ebp),0(%esp),4), но это не сработало. Хуже того, он выдает синтаксическую ошибку: bobi.s: 15: Ошибка: мусор `(% ebp), 0 (% esp), 4) 'после выражения

Какой правильный синтаксис?

1 Ответ

5 голосов
/ 01 ноября 2009

В сборке x86 нет единой инструкции для этого. Вы должны найти доступный регистр, использовать его для хранения адреса массива, полученного из -4(%ebp), найти другой регистр для хранения индекса 0(%esp), и только тогда станет возможным доступ к интересующей вас ячейке в (и в более RISC-подобных сборках вам все равно нужно добавить эти два регистра вместе, прежде чем вы сможете получить доступ к памяти).

Предполагается, что регистры доступны, что-то вроде:

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

должно работать.

...