В ассемблере NASM
можно объявить локальную метку, используя префикс .
.
- Итак, каков адрес локальной метки (и метки во всех ассемблерах вообще)? Является ли это относительным или абсолютным, или это зависит от использования?
Я спрашиваю, потому что есть особенности, которые меня смущают. Это пример кода:
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
, адрес будет вычисляться как обычный абсолютный адрес по отношению к происхождению.
- Но если я возьму метку и использую ее с
short
(как в последней строке), что произойдет? Смещение для перехода рассчитывается по абсолютному адресу?
Я спрашиваю все это, потому что у меня в коде есть локальные метки (.LNXYZ
, сгенерированные случайным образом), и мне нужно составить список адресов (из этих меток), которые будут иметь 4-байтовые элементы, содержащие абсолютный адрес для переходов. Возможно ли такое, или я должен использовать обычные ярлыки? Есть ли какая-либо директива для этого?
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