Ассемблер 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
формы должны генерировать один и тот же код.