Инструкция по сборке кода

Что делает операция

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 содержащий смещение байта массива члена.

Это то, что происходит в общем... но это зависит от ситуации...

Другие вопросы по тегам