这段汇编代码中r10和r20的地址是什么?

What are the addresses of r10 and r20 in this assembly code?

当我查看此 AVR 汇编代码及其等效(部分完成的)地址和二进制文件时,我无法弄清楚哪些寄存器应该是 r10 和 r20。我能弄清楚的是,至少我相信,寄存器 X 和 Y 分别是 $004A 和 $004B

在 AVR 架构中,寄存器位于数据存储器的第一个 32 地址 space,如下图所示。

寄存器的地址可以用指令操作码中的 5 位来表示,要准确知道操作码中的 5 位在哪里,您必须查看 AVR instruction set Manual 并查看每条指令二进制

例如,如果您查看手册中的 第 115 页 ,您将看到 LDi 指令的二进制翻译,这限制您只能访问上层16 register (from r16 to r31) 16只在第4位表示,所以它出现在第三个半字节为litter d(d是“destination register”的缩写)注意:如果dddd位取一个值从 0000 到 1111 这将从 r16 映射到 r31


I cannot figure out which registers are supposed to be r10 and r20

让我们手动将这段代码ClR R10 翻译成操作码来找出答案

在手册(第 71 页)中,您会发现 ClR 只是 EOR(异或),这意味着

clr R10
; is same opcode as 
EOR R10,R10

现在尝试找到 EOR 翻译而不是 ClR,在手册(第 91 页)中你会找到以下内容

EOR Rd,Rr
;will translat to 
;0010 01rd dddd rrrr

现在用 r10 替换 RdRrr10 在二进制中将是 01010) 所以输出将是

;be carful in bits location
;the bits are mixed
0010 01rd dddd rrrr  
0010 0100 1010 1010

这是CLR R10

的翻译

现在尝试自己翻译 ROR r20(提示:ROR 第 145 页)


What I can figure out is, at least I believe, that registers X and Y are [=28=]4A and [=28=]4B respectively

这是不正确的,X Y和Z寄存器实际上是一对r27:r26,r29:r28和r31:r30寄存器

间接存储指令 ST 将根据选择的对(x、y、z 作为这些对的别名)为不同的操作码进行翻译,您可以在 页中看到它们手册中的 173-177