avr gcc内联程序集:跳转到带有运行时偏移量的标签

avr gcc内联程序集:跳转到带有运行时偏移量的标签,gcc,assembly,label,offset,avr,Gcc,Assembly,Label,Offset,Avr,在avr gcc内联程序集中,如何跳转到标签加上运行时确定的偏移量?我想我可以用它来实现类似查找表的东西 据我所知,可以将标签地址加载到Z寄存器,添加一个偏移量,然后使用ijmp指令。但我不知道如何加载标签地址。这不起作用: ldi r30,((label)>>0)&0xFF ldi r31,((label)>>8)&0xFF 改用可重定位表达式修饰符。引述: lo8 此修饰符允许您使用地址表达式的0到7位 作为8位可重定位表达式。 hi8 此修饰符允许

在avr gcc内联程序集中,如何跳转到标签加上运行时确定的偏移量?我想我可以用它来实现类似查找表的东西

据我所知,可以将标签地址加载到Z寄存器,添加一个偏移量,然后使用
ijmp
指令。但我不知道如何加载标签地址。这不起作用:

ldi r30,((label)>>0)&0xFF
ldi r31,((label)>>8)&0xFF

改用可重定位表达式修饰符。引述:

lo8
此修饰符允许您使用地址表达式的0到7位
作为8位可重定位表达式。
hi8
此修饰符允许您使用地址表达式的第7位到第15位
作为8位可重定位表达式。例如,这对于AVR非常有用
`本地设计院(ldi)说明和“lo8”修改器。
例如
本地设计院(ldi)r26,lo8(sym+10)
本地设计院(ldi)r27,hi8(sym+10)
下午八时
此修饰符允许您使用地址表达式的0到7位
作为8位可重定位表达式。此修饰符对于寻址数据非常有用
或闪存/程序存储器中的代码。“pm_lo8”的用法与“lo8”类似。
下午八时
此修饰符允许您使用地址表达式的第8位到第15位
作为8位可重定位表达式。此修饰符对于寻址数据非常有用
或闪存/程序存储器中的代码。

但我确实担心,如果gcc决定将代码放在128K闪存之外,这可能会悄悄中断(是的,我有比这更大的代码)。但是我可能会问另一个关于这个的问题。还有
pm_hh8
修饰符和
EIJMP
指令,但是由于您的原始代码也只使用16位寻址,为了简洁起见,我省略了它。