2016-08-19 4 views
0

Как я могу получить адрес метки?Плоский ассемблер: Как я могу получить адрес метки?

я хочу, чтобы получить адрес от метки в плоском ассемблере без добавления дополнительного кода

пример:

label1: ;is at adress 0 
db 1h,2h,3h,4h,5h ;some data 

label2: ;is at adress 5 because label1 has 5 bytes of data 

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

им известно только, используя ярлык, но я хочу номер необработанного адреса.

+0

Используйте отладчик или что-то вроде 'objdump', чтобы получить адрес из таблицы символов. Адреса ярлыков не хранятся нигде вне таблицы символов, если вы их не используете (например, как цель перехода, адрес загрузки/хранения, непосредственный операнд или как данные (например, '.dd label2'). –

+0

Хорошо. Обратите внимание, что было бы более точно сказать, что между «label1» и «label2» имеется 5 байтов данных, метки не имеют связанного с ними размера (если вы не используете используя MASM или TASM, где db/dw/dd после ярлыка магически подразумевает размер операнда для инструкций, которые используют эту метку в операнде памяти). –

+0

В любом случае, просто чтобы уточнить, вы не хотите получать адрес в регистр или в память внутри программы, правильно? Вы хотите, чтобы она была напечатана на вашем экране каким-то образом отдельно от запуска вашей программы? –

ответ

1

Быстрое решение:

я просто положить все символы в самом конце файла сборки, а затем посмотрел на него с шестнадцатеричного редактора:

пример:

label1: ;example label (can be anywhere) 
;... 
;... My Programm 
;... 

;the end of the program 
db 0h ;just some spacer 
dw label1 
+0

yup, это работает и не должно мешать компоновке предыдущего кода. Если FASM имеет директиву ALIGN, это может сделать блок адресов удобным для поиска и выровнен в начале строки шестнадцатеричного дампа. Вероятно, вы можете сказать из моего ответа, что я ничего не знаю о FASM, и в основном использую NASM/YASM для Linux. –

0

Создайте свою программу с помощью отладочных символов, поэтому таблица символов (метаданных) в объектном файле содержит адреса всех ярлыков.

Затем вы можете использовать objdump -t, чтобы сбросить таблицу символов исполняемого файла или любую другую программу, которая делает то же самое.


Помимо таблицы символов, адреса меток будут находиться в двоичном формате, встроенном в инструкции, например. в режимах абсолютной адресации для режимов адресации, непосредственных операндов или в виде данных (например, .dd label2). Обычные прыжки используют относительную кодировку, поэтому вы не найдете абсолютный адрес символа в кодировке команд для переходов.

TL: DR: дизассемблирование двоичного кода, чтобы найти абсолютные адреса, возможно, но только для меток, используемых таким образом, поэтому таблица символов является более удобной.

Если вы собираете плоский двоичный файл (например, загрузочный сектор), в формате файла нет символьной таблицы. Таким образом, вы зависите от наличия информации о символе печати FASM для вас, когда вы используете параметр командной строки для этого. Я googled и нашел, что there's a -s option, чтобы написать файл-информация об отладке файла вывода.

+1

Я не уверен, что FASM поддерживает отладочные символы и что файл '.fas', к сожалению, недоступен для человека. –