|
发表于 2008-5-24 21:28:13
|
显示全部楼层
如果你想非常正确的理解汇编指令,请参考AVR STUDIO的HELP中关于每条指令的格式和操作,在我的书中也有.
对于相对跳转指令的真正机器码形式和操作如下:
相对跳转指令
RJMP K
机器码为 1100 kkkk kkkk kkkk
操作 PC <- (PC+1)+k
Cycles: 2
下面我们根据反汇编给出的信息做介绍:
+0000006B: C009 RJMP PC+0x000A Relative jump
1.这条指令的地址是 00006B
2.机器码是 C009H 二进制为 1100 0000 0000 1001 (注意:实际k是9,不是A)
具体操作过程:
1.从00006B取出RJMP指令,此时PC已经为00006C.注意:操作中的(PC+1),实际就是指PC已经加1,指向下1条指令了.
2.CPU执行这条指令,将此时的PC值(00006C) + 9 = 000075 放入PC.即执行完RJMP指令后PC = 000075
3.CPU从PC指向的地址取出下面要执行的指令.
4.AVR大部分的指令是单周期的,所谓单周期,就是执行本指令的同时就取出下一条指令.
5.但这条指令需要2个周期.原因是执行RJMP指令时,由于本指令执行需要修改PC,所以执行RJMP的同时是不取指令的,要等本指令执行完再取下一条指令(查看AVR的转移指令,至少是2个周期)
6.因此,此指令本身的执行需要一个周期,取下一条指令需要一个周期.固称RJMP指令为2个周期的指令.
在指令的描述中
PC <- (PC+1)+k =====>括号中的PC指本指令地址,(PC+1)表示取出本指令后,PC已经加1,指向下条指令了.
RJMP PC+0x000A =====>这里的PC也是指本指令地址,A则是偏移量(9)加1的结果.也就是(PC+1)+00009.
所以,真正的偏移量为9.
大多数的人都不真正了解什么是汇编语言格式,和机器指令格式,认为它们是一样的.实际是错了.
我们编写的汇编,实际不是真正的机器格式,汇编语言要经过汇编系统的编译才能生成机器指令的,汇编系统,尤其是AVR的汇编系统,本身已经有很强的运算能力,它可以先进行运算(包括一些函数的执行),而其结果才是真正的指令操作码.
例如:你可以这样写汇编指令:ldi r16,3+2.可是真正的ldi指令是不能完成加法的.而是是由汇编编译系统计算3+2,得到5,然后生成实际的指令为ldi r16,5.
所以 RJMP PC+0x000A,是AVR汇编采用的一种表述,其真正的指令应该是 RJMP 9. 采用RJMP PC+0x000A描述方式主要是想让程序员方便理解:直接以本指令的地址,加上后面的数就是下一条要执行的指令.其实际的结果是相同的,但可能把你弄晕了.
不过,我罗嗦这么多,可能会使你更晕^_^ |
|