51单片机通用寄存器Rn不够用怎么办?(我是新手)

2019-07-16 06:12发布

我在编一个汇编程序的时候把Rn的R1~R6都用了,现在又要编一个延时子程序,需要用到三个Rn,例如R0、R1、R7, 我是把Rn用MOV Rn,direct指令存在一个地方后,再调Rn来编写延时程序。这对吗?如果不对,有什么其他的办法?
    不是听说通用寄存器Rn有四组嘛,是不是切换一组后就又可以从R0用到R7了,然后用R0、R1、R7来编延时子程序,等结束后再换回到原来的那组去?如果这样可以,汇编程序怎么编,请指教。
    还有直接用push 01h 可以把R1压入堆栈吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
A670521546
1楼-- · 2019-07-16 11:21
 精彩回答 2  元偷偷看……
郎基奴斯长枪
2楼-- · 2019-07-16 16:47
谢谢,有空我去试试。
郎基奴斯长枪
3楼-- · 2019-07-16 20:39
那push 01h可以把0组的R1压入堆栈,是不?
xinhong新鸿
4楼-- · 2019-07-17 01:20
在调用子程序时Rn好像会自动入栈,返回子程序时会自动出栈,起到现场保护作用。我最近也在学,具体怎么回事也不太清楚。
下面代码是正确的,可以参考一下。

        ORG   0000H
START:
                MOV   R7,#08H
                MOV   A,#0FFH
                CLR   C
LED:   
        RLC    A
        MOV   P1,A
                CALL  DELAY
                DJNZ  R7,LED
                AJMP  START

;;延时1s(1+20+100X20)+[(250X100X20)+(100X20)+20]X2=1006462 us=1s
DELAY:                                                                          ;机械周期
        MOV   R5,#20        ;1                                   1
DLY3:        MOV   R6,#100        ;20                                   1
DLY2:        MOV   R7,#250        ;100X20                           1
DLY1:        DJNZ  R7,DLY1   ;250X100X20                   2
        DJNZ  R6,DLY2        ;100X20                           2
                DJNZ  R5,DLY3        ;20                                   2
               RET       

            END

一周热门 更多>