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

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

.bss
woof: .long 0

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

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

Ваша помощь очень ценится!

1 ответ

Решение

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

В настоящее время в большинстве ассемблеров, в частности в GNU для Intel, больше нет .bss директива, так что вы временно переключаетесь на bss и создаете символ bss в одном кадре с чем-то вроде: .comm sym,size,alignment, Вот почему вы, вероятно, получаете сообщение об ошибке ".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 формы должны генерировать один и тот же код.

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