2015-04-22 4 views
0

В настоящее время у меня есть небольшая (ARM Cortex M4) программа для сборки, отрывок, для которого у меня есть вопрос ниже:Какова ценность счетчика программ при использовании их в инструкции? (Монтаж)

PC Instruction 
0x9c MOV R0, #0 
0x9e LDR.N R1, [PC, #0x20] 
0xa0 STR.N R0, [R1] 

Во второй строке PC = 0x9e. Но, когда вы получаете доступ к ПК как к одному из операндов, какое значение оно имеет? 0x9e или 0xa0?

+0

Вы не можете сделать что-то вроде 'beq', чтобы проверить это? – mstbaum

+0

@mstbaum Этот код является переведенной версией из моего кода c, я не думаю, что могу изменить любой ассемблерный код, но я пытаюсь понять его. –

+0

Технически он имеет значение '0xa2' в соответствии с руководством: _ Значение ПК будет на 4 байта больше адреса этой инструкции_. Однако будьте осторожны, потому что ваш дизассемблер, возможно, уже компенсировал это. Возможно, вы захотите проверить машинный код. – Jester

ответ

1

Отображаемые значения ПК почти наверняка не являются абсолютными. Они обычно относятся к началу модуля.

Различные версии ARM имеют разные характеристики чтения ПК. Ранние версии имеют значение, эквивалентное 0x9e. Более поздние версии имеют значительный «вид», поэтому они имеют значения 0xa0 или выше. То есть, к тому времени, когда ПК отбирается, он уже секвенирован для получения следующей инструкции (ов).           Убитый, потому что @Notlikethat нашел ссылку на 1985 год, в которой говорится, что все они +8 продвинуты.

Таким образом, вторая инструкция операнда источника PC, #0x20 добавляет 32 к значению ПК, но ПК имеет абсолютный адрес (примерно), где инструкция, которая может быть перемещена на миллиард байтов выше 0x9e.

+1

Этот второй абзац неверен. Значение в r15 всегда является текущей инструкцией + 8 байтов в состоянии ARM и текущей инструкцией + 4 байта в состоянии Thumb. Использование ПК в качестве базового регистра для адресации добавляет тонкость выравнивания слов по значению, а адреса возврата исключений становятся немного напуганными, но _reading_ на ПК всегда был случай «двух наборов команд вперед». – Notlikethat

+0

@Notlikethat: Я удалил нечетный адрес, но я не думаю, что он всегда * + 8 в не-большом пальце. Я уверен, что на ARM 1 (и, возможно, 2) это ПК + 0. – wallyk

+0

@Notlikethat: В [другом ответе] (http://stackoverflow.com/a/24092329/198536), насколько вы уверены, что оригинальный ARM предоставил PC + 8? – wallyk

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