打印

求教一个函数调用问题

[复制链接]
1866|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
icycoffee|  楼主 | 2011-4-21 20:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人菜鸟,求教一个问题:
   程序中刚开始切换到第一组寄存器,并令R0=8,接下来调用一个子程序,当跳到该子程序中时,R0中的值为什么变了呢?寄存器组没有变,难道是调用函数过程中改变的吗?求解释

相关帖子

沙发
icycoffee|  楼主 | 2011-4-21 20:27 | 只看该作者
有木有人啊 好困惑啊

使用特权

评论回复
板凳
icycoffee|  楼主 | 2011-4-21 20:54 | 只看该作者
ORG 0000H      
     SJMP TEST
     ORG 0030H

;-----------------------------------------------------
;  TEST
;  功能:测试32位二进制与32位二进制乘法运算正确性
;-----------------------------------------------------

TEST:
     
        CLR RS1          ;寄存器1组
     SETB RS0
                                    ;    <--------------------------没有赋值之前 R0 = 47H
     MOV R3,#00H      ;被乘数 = 8
     MOV R2,#00H
     MOV R1,#00H
     MOV R0,#08H

     MOV R7,#00H      ;乘数 = 2
     MOV R6,#00H
     MOV R5,#00H
     MOV R4,#02H
     
     LCALL MUL_INIT    ;调用乘法函数
    ...
MUL_INIT:
                            ;<-------------调试过程中,跳到该处,R0中的值就变成原来的值47H ???     
      CLR A      
      CLR C
    ...

使用特权

评论回复
地板
Fairchild2440| | 2011-4-21 21:25 | 只看该作者
默认堆栈区是第一组寄存器,你LCALL子程序不是得PUSH么,把返回地址压到第一组的R0了

使用特权

评论回复
5
Fairchild2440| | 2011-4-21 21:38 | 只看该作者
你查看list文件看看“LCALL MUL_INIT    ;调用乘法函数
”这条指令的下一条地址是不是47H

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
icycoffee + 1 谢谢
6
sysdriver| | 2011-4-21 23:26 | 只看该作者
初始化的SP=07H

程序开始时,一般把SP设到30H~70H吧

使用特权

评论回复
7
icycoffee|  楼主 | 2011-4-22 08:41 | 只看该作者
谢谢楼上的几位 原来看过书,但是没注意
开始没有设置SP,默认的SP=07H 即工作寄存器0组的R7,调用子程序后,SP=08H正好是第一组的寄存器R0,下一条指令的地址就是47H R0=47H

使用特权

评论回复
8
tyr05| | 2011-4-22 20:37 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:热爱生活 崇尚自由

0

主题

46

帖子

1

粉丝