Инструкция по сборке кода
Что делает операция
movl (%esi, %ecx,4), %eax
делать?
Насколько я понимаю, он будет хранить в %eax
эквивалент %ecx * 4 + %esi
,
2 ответа
Это эквивалентно следующему в синтаксисе Intel:
mov eax,[esi + ecx*4]
Что он будет делать, это прочитать 32 бита из памяти по адресу, сформированному esi + ecx*4
и положить это значение в eax
,
Да, ты пишешь.
Это называется режимом индексной адресации.
Это синтаксис:
<constant1/label> (%reg1, %reg2, constant2)
то есть либо constant1
или же label
без <
& >
,
%reg1
а также %reg2
должны быть георадары.<constant1/label>
не является обязательным.%reg1
не является обязательным.
Это приводит к: constant1 + %reg1 + %reg2 * constant2
В общем-то, constant1 or label
а также %reg1
используются для базового адреса массива. А также %reg2
& constant2
используются для индекса.
Например:
Допустим, у вас есть глобальный массив:
.section .data
.globl arr
.type arr, @object
.size arr, 20
.align 4
arr:
.long 10, 20, 30, 40, 50
Тогда вы можете написать...
movl $2, %eax # Move the index into %eax
movl arr( , %eax, 4), %edx
Это означает: %edx = arr + %eax * 4
, т.е. базовый адрес + 8 байт.
Вы можете думать об этом как %edx = arr[2]
В общем-то,
Если у вас есть глобальный массив с меткой, то вы используете label
для базового адреса.
Если у вас есть локальный массив, то вы используете %reg2
для базового адреса.
Если у вас есть глобальная структура, содержащая массив, то вы используете оба label
структуры + %reg2
содержащий смещение байта массива члена.
Это то, что происходит в общем... но это зависит от ситуации...