求教一个函数调用问题

[复制链接]
2854|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了
Fairchild2440 发表于 2011-4-21 21:38 | 显示全部楼层
你查看list文件看看“LCALL MUL_INIT    ;调用乘法函数
”这条指令的下一条地址是不是47H

评分

参与人数 1威望 +1 收起 理由
icycoffee + 1 谢谢

查看全部评分

sysdriver 发表于 2011-4-21 23:26 | 显示全部楼层
初始化的SP=07H

程序开始时,一般把SP设到30H~70H吧
 楼主| icycoffee 发表于 2011-4-22 08:41 | 显示全部楼层
谢谢楼上的几位 原来看过书,但是没注意
开始没有设置SP,默认的SP=07H 即工作寄存器0组的R7,调用子程序后,SP=08H正好是第一组的寄存器R0,下一条指令的地址就是47H R0=47H
tyr05 发表于 2011-4-22 20:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

0

主题

46

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部