ассемблер гну: получите адрес маркировки/переменной [INTEL SYNTAX]

У меня есть код как это:

.bss
woof: .long 0

.text
bleh:
...some op codes here.

теперь я хотел бы переместить адрес лая в eax. Каков код синтаксиса Intel здесь для того, чтобы сделать это? То же идет с адресом движущегося bleh в, скажем, ebx.

Ваша справка очень ценится!

5
задан Matt 3 July 2013 в 17:18
поделиться

1 ответ

В разделе bss не может быть никаких реальных объектов. Некоторые ассемблеры могут по-прежнему позволять вам переключаться в раздел .bss, но все, что вы можете там сделать, это сказать что-то вроде: x:. знак равно + 4 .

В наши дни в большинстве ассемблеров, особенно в gnu для Intel, больше нет директивы .bss , поэтому вы временно переключаетесь на bss и создаете символ bss за один раз, примерно так: .comm sym, размер, выравнивание . Вот почему вы предположительно получаете сообщение об ошибке «. директива bss не распознана » или что-то в этом роде.

А затем вы можете получить адрес с помощью:

lea woof, %eax

или

movl $woof, %eax

Обновить: ага, синтаксис Intel, а не архитектура Intel. ОК:

.intel_syntax noprefix
    lea    esi,fun
    lea    esi,[fun]
    mov     eax,OFFSET FLAT:fun
.att_syntax
    lea     fun, %eax
    mov     $fun, %eax
.data
fun: .long 0x123

Все формы lea должны генерировать один и тот же код.

8
ответ дан 14 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: