完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我在编一个汇编程序的时候把Rn的R1~R6都用了,现在又要编一个延时子程序,需要用到三个Rn,例如R0、R1、R7, 我是把Rn用MOV Rn,direct指令存在一个地方后,再调Rn来编写延时程序。这对吗?如果不对,有什么其他的办法?
不是听说通用寄存器Rn有四组嘛,是不是切换一组后就又可以从R0用到R7了,然后用R0、R1、R7来编延时子程序,等结束后再换回到原来的那组去?如果这样可以,汇编程序怎么编,请指教。 还有直接用push 01h 可以把R1压入堆栈吗? |
|
相关推荐
4个回答
|
|
51的工作寄存器一共有32个,为内存中的00H--1FH单元,分为4组,分别是
0组00H--07H单元、1组08H--0FH单元、2组10H--17H单元、3组18H--1FH单元, 每组的8个单元分别对应R0--R7。 这四组中只有一组是当前工作寄存器,程序中使用的就是当前工作寄存器中的8个单元。当前工作寄存器是可以由我们编程序指定的,并且在程序中可以随时变换。 在PSW中,的PSW4、PSW3两位组合的00、01、10、11四个状态,分别指定工作寄存器的0组、1组、2组、3组, 只需要用指令改变PSW的这两位状态,就可以改变当前工作寄存器组。 这样,实际上就是有32个工作寄存器可以选用。 就是这样的了: RS1 RS0 字节地址 0 0 0组寄存器 00H~07H 0 1 1组寄存器 08H~0FH 1 0 2组寄存器 10H~17H 1 1 3组寄存器 18H~1FH RS1=PSW.4 RS0=PSW.3 通过更改RS0 RS1 位状态可随意切换4组寄存器 |
|
|
|
谢谢,有空我去试试。
|
|
|
|
那push 01h可以把0组的R1压入堆栈,是不?
|
|
|
|
在调用子程序时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 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
364 浏览 0 评论
356 浏览 0 评论
嵌入式学习-搭建自己的ubuntu系统之ubuntu网络设置
526 浏览 0 评论
龙芯中科胡伟武:3B6600 八核桌面 CPU 性能将达到英特尔中高端酷睿 12~13 代水平
574 浏览 0 评论
树莓派Pico 2发布,搭载RP2350双核RISC-V和Arm Cortex-M33微控制器!
542 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10692 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 12:13 , Processed in 0.467699 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号