知道 ldi 命令放置在 X、Y、Z 寄存器中的值

knowing the value ldi command is placing in X, Y, Z-Register

当我 运行ning 程序时,您怎么知道不同的寄存器得到什么值?就像我们在 图 1 中看到的那样,在第 8 行之后 R30 寄存器(Z 指针)更改为 0x94,如果我 运行 再多一行 R29 变为 0x01。但是R28和R31的值没有变化。

.cseg           
.org 0
rjmp start
.org 0x46

start: 
 ldi r31,high(tabell*2)         
 ldi r30, low(tabell*2)     //line 8    
 ldi r29,high(behandlet)            
 ldi r28,low(behandlet)         

tabell:
 .db 0xc2,0x09,0x64,0xab
 .db 0x73, 0x01, 0x0c, 0xfb

 .dseg
 .org 0x100
behandlet:
 .byte 8

图片1:

不确定您对什么感到困惑。只需找出所涉及符号的地址,并应用给定的操作即可。最后将结果放入给定的目标寄存器。

第 8 行:ldi r30, low(tabell*2) 好的,所以我们需要找出 tabell 的地址。由于 start 位于 0x46 且这是程序存储器,因此每条指令计为 1。因此,tabell 位于 0x4A。乘以 2 得到 0x94,取低字节显然是空操作。所以这就是为什么 r30 更改为 0x94.

下一行:ldi r29,high(behandlet) 这更简单,因为 behandlet 直接在 org 0x100 之后,所以这是它的地址。取其高字节显然是0x01.

r28r31 不会改变,因为它们已经为零,并且相应的指令也将它们加载为零。参见上文了解为什么 high(tabell*2)low(behandlet) 都是 0.