我需要将avr汇编程序手动转换为十六进制。我知道我应该使用指令操作码,但是我不知道如何使用它。例如,LDI
指令的语法为:
LDI Rd,K
操作码为:1110 kkkk dddd kkkk
那么对于那些kkkk
,我应该将它们加在一起吗?如果是这样,结果将超过4位,该怎么办?
这是代码:
LDI R16,HIGH
OUT SPH,R16
LDI R16,LOw
OUT SPL,R16
LDI r24,$2b
STS $0069,r2
答案 0 :(得分:2)
好的,让我们看看这是如何完成的。
首先,获取一个指令表。我通过“ avr指令表”在一个简单的网络搜索中找到了这首歌:
AVR Instruction Set Manual @ Microchip
LDI Rd, K
,其中d
为寄存器号,K
为要加载到该寄存器的立即值,在第73章中描述为编码为1110 KKKK dddd KKKK
。 / p>
我们需要查找字母的含义。好吧,文档对此没有任何回应。呃,证据不好,我们需要另一个资源。
其他热门歌曲之一看起来很有希望:
AVR instruction set - all opcodes @ Lyons42
只需单击一两次,我们发现K
的高半字节(4位半)进入操作码的第一个字节。较低的半字节进入第二个字节。
例如,LDI R23, 150
将具有d = 23 - 16 = 7
(负16,因为仅支持R16到R31,所以16是偏移量)和K = 150 = 0x96
。操作码变为1110 1001 0111 0110
或0xE976
。
所有下一条说明可以相同的方式翻译。
注意:一个更简单的解决方案是使用汇编器并查看其清单。但这可能是作弊。 ;-)
答案 1 :(得分:1)
操作码为:1110 kkkk dddd kkkk
那么那些kkkk我应该把它们加在一起吗?
因为文档未说明,所以正确的方法是使用最明显的编码,也就是说,将8位K的低4位放在后面的kkkk中,将高4位放在较早的kkkk中。 kkkk。
但是,您可以(并且应该)使用带有此指令的汇编器和一个常量(例如0x5A)来仔细检查这一点,在该常数中您可以知道运行的方向—然后查看汇编器输出的汇编列表,或者,使用objdump工具反汇编或查看调试器中的机器代码指令。
更广泛地说,您应该考虑设计实验以找到此类问题的答案。
看起来它可能会出现其他顺序,第一个kkkk中为低阶4位,最后一个kkkk中为高阶。