2015-01-15 1 views
2

Я пытаюсь прочитать какой-то код сборки xtensa и в тупике по инструкции L32R:Инструкция Xtensa: L32R - какой адсор загружен?

E.g. по следующей строке:

0000 2f04 <my_func>: 
    2f0c: ffef21   l32r a2, 2ec8 

В каком адресе загружается?

+0

Более подробное описание на стр. 382 документа, к которому вы привязались. – Michael

+0

Комментарий Майкла был включен в ответ ниже. – ARF

ответ

4

В Xtensa Instruction Set Architecture Reference Manual ручные состояния на странице 382, ​​что для l32r адрес вычисляется следующим образом:

L32R forms a virtual address by adding the 16-bit one-extended constant value encoded 
in the instruction word shifted left by two to the address of the L32R plus three with the 
two least significant bits cleared. Therefore, the offset can always specify 32-bit aligned 
addresses from -262141 to -4 bytes from the address of the L32R instruction. 32 bits 
(four bytes) are read from the physical address. 

Таким образом, в приведенном выше примере продолжается; манипуляция константы:

 ffef 16-bit constant 
ffff ffef 16-bit constant one-extended 
ffff ffbc shifted left by two 

Манипуляция ПК:

0000 2f0c program counter 
0000 2f0f pc +3 
0000 0f0c masked bits 0 and 1 

вычисления виртуального адреса:

ffff ffbc 
+ 0000 2f0c 
=========== 
1 0000 2ec8 

Так отбрасывая все за 16-битном: 2ec8

+0

Почему значение ПК в вашем примере 2f0c, когда исходный пример сказал 2f04? Извините, если это кажется очевидным, но я начинаю с MCU, пытаясь отладить «Неустранимое исключение (0)», по-видимому, вызванное l32r на моем ESP8266. –

+0

@ MichaelBöckling Я считаю, что в исходном вопросе я вручную «упростил» разборку и в процессе изменил смещение. Это должно быть '2f0c' не' 2f04'. Теперь я исправил исходный вопрос. – ARF

0

Команда L32R загружает 32-битное значение из указанного адреса. Поэтому «l32r a2, 2ec8» загружает 32-битное значение, расположенное по адресу 0x2ec8, в регистр a2. Вам придется посмотреть на это место при разборке.