Assembly Language - LDI

2019-09-16 08:08发布

问题:

I am having trouble figuring out weather to load a regisiter with the contents of the data in the regisiter or indirectly load the register with the address of the value when we execute LDI.

Example:

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

what is the data in R6 after excecuting x3000?

回答1:

well take this for example

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

assemble and dump

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

and hand disassemble

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

The LDI instruction does this:

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

the lower 9 bits of the instruction are 0x002 which sign extends to be 0x0002. the pc is the modified pc so when executing the instruction at address 0x3000 the pc is actually 0x3001 so

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.