搜索
bottom↓
回复: 7

马老师您好:我是初学者,有个AVR的PC指向的问题,如图:0X006B处的指令为什么运行时指向0X0

[复制链接]

出0入0汤圆

发表于 2008-5-23 21:30:30 | 显示全部楼层 |阅读模式
此程序为您的教程 Demo_7_1.c的反汇编,AVR中的PC不是下一条将要执行的指令的地址吗?

(原文件名:untitled.JPG)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-5-24 11:15:02 | 显示全部楼层
rjmp pc+0x000a  这条指令的地址的是0006bh,所以当cpu读取该指令时,PC的值是0x0006b.那么0x0006b+0000a = 000075h,即跳到000075H执行.

另一种了解方式是:从当前指令处,跳到+A处执行(相对转移指令).

出0入0汤圆

 楼主| 发表于 2008-5-24 18:35:47 | 显示全部楼层
1、不知这样理解对否?也就是执行rjmp pc+0x000a这条指令时PC的值已经变成(0x006b+0x000a)了,但在取指rjmp pc+0x000a这条指令时PC的值是0x006b。
2、准确的说:对确定的一条指令PC中的内容在取指期间就是当前正在取指的指令的存储地址,在此指令的执行期间才是下一条将要取指的指令地址 。不知对否?谢谢!
3、对于0x00000063处的指令st -y,r30在其取指时PC的值是0x0063,当执行此指令时PC的值就是0x0064了。对吗?

出0入0汤圆

发表于 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描述方式主要是想让程序员方便理解:直接以本指令的地址,加上后面的数就是下一条要执行的指令.其实际的结果是相同的,但可能把你弄晕了.

不过,我罗嗦这么多,可能会使你更晕^_^

出0入0汤圆

 楼主| 发表于 2008-5-24 22:15:06 | 显示全部楼层
非常感谢马老师的回答,我当时也查了您的书中的相关解释,因为无详细的操作过程解释,我也想过0x000a是0x0001+0x0009的结果,但不确定,现在基本明白了。

还想请教一下,正常顺序执行指令时,PC的值是在什么时刻变化的? 是不是取出的指令送入指令寄存器时执行+1的?

出0入0汤圆

发表于 2008-5-25 13:14:29 | 显示全部楼层
对于单周期指令,在取出当前指令后,PC自动加1.译码执行当前指令的同时取下条指令.

象你这样的去仔细理解汇编操作的现在很少了.在书中每条指令的操作和功能都有,至于具体解释就不能多写了.书已经很厚,有人还认为说汇编讲的太多.

从我本人的观点,赞成和支持这样的学习方法和态度,只有基础扎实,才真正有上升的空间.这比每到毕业的这个学期,出现很多的"吐血""跪求"xxxx程序要好的多.

出0入0汤圆

 楼主| 发表于 2008-5-25 19:16:06 | 显示全部楼层
谢谢马老师详细而不辞厌倦的回答。我在读书时学的是周明德的Z80,但现在基本忘光了,简单用过C51。现在没事时看AVR,在看Demo_7_1.c时,想看一下CVAVR中中断的保护现场软堆栈的实现和x.y.z的初始化,看到rjmp pc+0x000a的目的地址,感觉不太清楚,所以就想搞明白。当然用C可以不管这些,最后再说声谢谢!

出0入0汤圆

发表于 2008-7-13 09:56:13 | 显示全部楼层
这个帖子对我很有帮助,谢谢马老师。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 08:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表