Язык ассемблера - LDI

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

Пример:

x3000 LDI R6, far
x3001 ...(some command)
x3002 ...(some command)
x3003 far x6000
...
x6000  xf000

что за данные в R6 после исключения x3000?

1 ответ

Решение

Хорошо, например

.orig x3000
LDI R6, far
ADD R0,R0,#0
ADD R0,R0,#0
far .fill x6000
.end

собрать и сбросить

hexdump -C test.obj
00000000  30 00 ac 02 10 20 10 20  60 00                    |0.... . `.|
0000000a

и руки разбирать

0x3000: 0xAC02  ldi r6,#+2 
0x3001: 0x1020  add r0,r0,#0
0x3002: 0x1020  add r0,r0,#0
0x3003: 0x6000  

Инструкция LDI делает это:

DR = mem[mem[PC† + SEXT(PCoffset9)]];
setcc();

младшие 9 битов инструкции равны 0x002, знак которого расширяется до 0x0002. ПК является модифицированным ПК, поэтому при выполнении инструкции по адресу 0x3000 ПК фактически равен 0x3001, поэтому

DR = mem[mem[0x3001+0x0002]]
DR = mem[mem[0x3003]]
DR = mem[0x6000]
DR = 0xF000 using your definition for what lives at address x6000.
DR is r6 so 0xF000 is stored in r6.  
0xF000 is considered a negative so the flags are N = 1, Z = 0, P = 0 if I understand the flags correctly.
Другие вопросы по тегам