ассемблер gnu:получить адрес метки / переменной [СИНТАКСИС INTEL]

StackOverflow https://stackoverflow.com/questions/1897401

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top