ассемблер gnu:получить адрес метки / переменной [СИНТАКСИС INTEL]
-
19-09-2019 - |
Вопрос
У меня есть такой код, как этот:
.bss
woof: .long 0
.text
bleh:
...some op codes here.
теперь я хотел бы переместить адрес woof в eax.Что это за синтаксис intel код здесь для этого есть?То же самое касается переноса адреса bleh, скажем, в ebx.
Мы очень ценим вашу помощь!
Решение
В разделе 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
формы должны генерировать один и тот же код.