我目前正在通过为Arduino Uno构建汇编程序来教授自己的汇编语言。但是,我正在努力将RJMP转换为二进制文件。
在amtel文档中,RJMP以二进制形式表示为1100 kkkk kkkk kkkk
,其中k
是要跳转到的相对地址。
汇总以下代码:
check_press_loop:
sbis PIND, 2
rjmp check_press_loop
我得到了拆解:
10: fe cf rjmp .-4 ; 0xe
我理解为什么相对跳跃是-4个字节,我不明白的是这是由十六进制fc ef
表示的。由于“小端”字节顺序(cf fe
)而交换顺序会产生二进制值0b1100111111111110
。删除二进制值的指令(1100
)部分,111111111110
如何表示-4?
答案 0 :(得分:2)
希望您知道111111111110
在被解释为二进制补码有符号整数时为-2。这里使用-2的原因是因为check_press_loop
是从RJMP指令的末尾开始的两个16位字。由于AVR指令总是字对齐,因此RJMP指令无法编码以字节为单位测量的跳转偏移。处理器不能在程序存储器中的奇数字节地址执行指令,PC寄存器不能保存这样的地址。
答案 1 :(得分:-1)
尝试跳转0x1234 :)以查看半字节的位置