Каков адрес локальных меток в NASM?

В ассемблере NASM можно объявить локальную метку, используя префикс ..

  1. Итак, каков адрес локальной метки (и метки во всех ассемблерах вообще)? Является ли это относительным или абсолютным, или это зависит от использования?

Я спрашиваю, потому что есть особенности, которые меня смущают. Это пример кода:

ORG 0x400000 ;origin of address for labels

start:       ;address here should be 0x400000
.....        ;some code here

     .loop   ;local label
     .....   ;some code here
     jmp short .loop ;<------- address is not taken as absolute
     jmp short start

Если я возьму какую-нибудь обычную метку (например, start) для ссылки и использую ее с инструкцией lea, адрес будет вычисляться как обычный абсолютный адрес по отношению к происхождению.

  1. Но если я возьму метку и использую ее с short (как в последней строке), что произойдет? Смещение для перехода рассчитывается по абсолютному адресу?

Я спрашиваю все это, потому что у меня в коде есть локальные метки (.LNXYZ, сгенерированные случайным образом), и мне нужно составить список адресов (из этих меток), которые будут иметь 4-байтовые элементы, содержащие абсолютный адрес для переходов. Возможно ли такое, или я должен использовать обычные ярлыки? Есть ли какая-либо директива для этого?


person user35443    schedule 06.07.2013    source источник
comment
Вы, вероятно, хотите bits 32 вверху этого. Ваше происхождение кажется немного высоким для 16-битного кода (это то, что Nasm будет создавать по умолчанию. jmp label использует режим относительной адресации - фактический испускаемый код будет jmp distance_to_label. Не имеет значения, является ли метка локальной или нет. Для абсолютного прыжок, вам нужно будет сделать mov eax, label, а затем jmp eax. Вам не нужно кодировать short - Nasm должен дать вам прыжок short, если он подходит, и прыжок near, если он не подходит. Я не уверен Я понимаю часть о случайно сгенерированных ярлыках...   -  person Frank Kotler    schedule 06.07.2013
comment
Итак, если мне нужен список 32-битных абсолютных значений, сгенерированных NASM, что мне делать?   -  person user35443    schedule 07.07.2013


Ответы (2)


Из руководства пользователя NASM. :

3.9. Локальные ярлыки

NASM уделяет особое внимание символам, начинающимся с точки. Метка, начинающаяся с одной точки, рассматривается как локальная метка, что означает, что она связана с предыдущей нелокальной меткой. Так, например:

label1  ; some code 

.loop 
    ; some more code 

    jne     .loop 
    ret 

label2  ; some code 

.loop 
    ; some more code 

    jne     .loop 
    ret 

В приведенном выше фрагменте кода каждая инструкция JNE переходит на строку непосредственно перед ней, потому что два определения .loop хранятся отдельно, поскольку каждое из них связано с предыдущей нелокальной меткой.

Эта форма обработки локальных меток заимствована из старого ассемблера Amiga DevPac; однако NASM делает еще один шаг вперед, разрешая доступ к локальным меткам из других частей кода. Это достигается путем определения локальной метки в терминах предыдущей нелокальной метки: первое определение .loop выше на самом деле определяет символ с именем label1.loop, а второе определяет символ с именем label2.loop. Итак, если вам действительно нужно, вы можете написать

label3  ; some more code 
        ; and some more 

        jmp label1.loop
person Carlos Guzman    schedule 29.05.2014
comment
В то время, когда я задавал этот вопрос, у меня не было достаточно информации об ассемблере в целом, поэтому мой вопрос не был точным. На самом деле, я спрашивал о том, как получить абсолютный адрес метки. Вот что я могу сделать, используя имя метки в том месте, где мне нужен адрес, а NASM сделает все остальное за меня. Я хотел бы удалить свой вопрос сейчас, поэтому, если бы вы могли удалить свой ответ, я бы сделал это. - person user35443; 29.05.2014
comment
если вы хотите получить эффективный адрес метки, используйте инструкцию сборки LEA, она возвращает эффективный адрес памяти (метку) и сохраняет его в реестре LEA - person Carlos Guzman; 30.05.2014
comment
Или я просто использую имя символа. Не волнуйтесь ( :)), теперь я это понимаю, и поэтому я думаю, что этот вопрос больше не нужен. - person user35443; 30.05.2014
comment
Этот ответ (и вопрос) полезны и не должны быть удалены. - person IAbstract; 23.04.2015

Адрес локальной метки в NASM точно такой же, как если бы метка не была локальной.

Единственное, что меняется, это то, что имя метки добавляется к первой предыдущей нелокальной метке.

Минимальный пример:

outside_label:

    ; This should be not done in practice,
    ; but shows how it works under the hood.
    jmp outside_label.inside_label
    ; This is not reached.
.inside_label:

    ; This is what you should do in practice.
    ; Labels also get appended when used as arguments.
    jmp .inside_label2
    ; This is not reached.
.inside_label2:
person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 10.11.2015