AVR程序集:创建RJMP

时间:2016-05-18 16:42:08

标签: assembly binary arduino hex avr

我目前正在通过为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?

2 个答案:

答案 0 :(得分:2)

希望您知道111111111110在被解释为二进制补码有符号整数时为-2。这里使用-2的原因是因为check_press_loop是从RJMP指令的末尾开始的两个16位字。由于AVR指令总是字对齐,因此RJMP指令无法编码以字节为单位测量的跳转偏移。处理器不能在程序存储器中的奇数字节地址执行指令,PC寄存器不能保存这样的地址。

答案 1 :(得分:-1)

尝试跳转0x1234 :)以查看半字节的位置