2014-11-07 2 views
1

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

Я пишу ассемблер в C, и я понимаю, как собрать основные инструкции по сборке и макросы ассемблера, как бы наклейки действительно не застряли.

Say в следующем коде, который просто приращение значения в регистр 10 раз:

LDX #$00 

label: 

INC 
INX 
CPX #$0A 
BNE label 

Как ассемблер знать адрес этикетки :? Также, какой механизм он использует, чтобы связать метку в инструкции BNE с определением метки перед циклом?

И в дополнение к этому, скажем, аппаратное прерывание запускается в цикле (что неизвестно ассемблеру, потому что это происходит во время выполнения). ПК изменится, и, следовательно, любая метка в процедуре обслуживания прерываний будет иметь совершенно другой адрес, и поскольку большинство RISC-процессоров используют относительную адресацию ПК, это изменит адреса меток.

Также как примечание стороны, как правильно вставить код, чтобы он не отображался на одной строке, как сейчас?

+1

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

+0

И для кодовых блоков - выделите блок кода и нажмите кнопку '{}' в верхней части редактора (или CTRL-K, я думаю) –

+0

Ну, возможно, я сформулировал это неправильно. Если я пишу ISR с несколькими подпрограммами для разных векторов прерываний, как бы ассемблер отслеживал адреса? – Anthony

ответ

2

Общая концепция относительно проста.

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

Если скачок происходит перед меткой, это немного сложнее, но не так много:

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

-

Обработчики прерываний должны сохранять все состояние, так что те не имеют никакого отношения выше.

+0

Этот ответ помог мне, спасибо. Я возился с ASM в среде Arduino и смотрел на роль счетчика местоположений. Не могли бы вы рассказать о том, как Counter Counter играет роль во всем процессе? –

Смежные вопросы