AVR 8 位核心指令集包括更高效的 16 位版本的“从内存加载数据”(LDS) 和“将数据存储到内存”(STS) 指令,而不是 32 位版本。根据 AVR 指令集手册,两个版本的汇编语法完全相同。显然,汇编器是为了自己找出是否可以使用16位版本(即地址只有7位,寄存器是R16:31之一)。只是我发现 GNU 汇编器没有。它总是发出 32 位版本。
作为示例,考虑汇编代码
lds r17, 0x4D
GNU 汇编器发出
c4: 10 91 4d 00 lds r17, 0x004D
它应该发射的地方
c4: 1D A4 lds r17, 0x4D
也许有必要明确告诉汇编器使用16位版本,也许通过使用不同的助记符(偏离指令集手册)?
如何让 GNU 汇编器(AVR 版本)发出 16 位版本的 LDS 和 STS 指令?
您可能没有选择合适的MCU型号。例如使用
-mavrtiny
或 -mall-opcodes
发出 16 位编码。请注意,该值是 1D A1
而不是您声称的 1D A4
。
1 0000 1DA1 lds r17, 0x4D