将AVR汇编程序转换为十六进制

时间:2020-04-11 15:06:23

标签: assembly microcontroller avr

我需要将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

2 个答案:

答案 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 01100xE976

所有下一条说明可以相同的方式翻译。

注意:一个更简单的解决方案是使用汇编器并查看其清单。但这可能是作弊。 ;-)

答案 1 :(得分:1)

操作码为:1110 kkkk dddd kkkk

那么那些kkkk我应该把它们加在一起吗?

因为文档未说明,所以正确的方法是使用最明显的编码,也就是说,将8位K的低4位放在后面的kkkk中,将高4位放在较早的kkkk中。 kkkk。

但是,您可以(并且应该)使用带有此指令的汇编器和一个常量(例如0x5A)来仔细检查这一点,在该常数中您可以知道运行的方向—然后查看汇编器输出的汇编列表,或者,使用objdump工具反汇编或查看调试器中的机器代码指令。

更广泛地说,您应该考虑设计实验以找到此类问题的答案。


看起来它可能会出现其他顺序,第一个kkkk中为低阶4位,最后一个kkkk中为高阶。

相关问题