[51单片机] 高手们,麻烦帮小弟看下keil翻译的一小段汇编是什么意思

[复制链接]
1653|8
 楼主| coolhongjie 发表于 2015-5-17 10:01 | 显示全部楼层 |阅读模式
     7: void delay(uint del)
     8: {
     9:         while(--del);
C:0x0105    EF       MOV      A,R7
C:0x0106    1F       DEC      R7
C:0x0107    7001     JNZ      C:010A
C:0x0109    1E       DEC      R6
C:0x010A    14       DEC      A
C:0x010B    4E       ORL      A,R6
C:0x010C    70F7     JNZ      delay(C:0105)
    10: }
    11:  
C:0x010E    22       RET      
    12: void main(void)
    13: {
    14:         delay(258);
C:0x010F    7F02     MOV      R7,#0x02
C:0x0111    7E01     MOV      R6,#0x01
C:0x0113    120105   LCALL    delay(C:0105)

麻烦帮我看下delay中的汇编怎么工作的,还有为什么要ORL A,R6,感激不尽!!!
 楼主| coolhongjie 发表于 2015-5-17 10:20 | 显示全部楼层
哎,看来高手都很忙,没有时间理会我这些菜鸟呀
pang7 发表于 2015-5-17 10:39 | 显示全部楼层
如果r6与a 同时为零 延时结束
 楼主| coolhongjie 发表于 2015-5-17 11:28 | 显示全部楼层
pang7 发表于 2015-5-17 10:39
如果r6与a 同时为零 延时结束

请问,这个延时时间应该怎么算?我知道各个指令的机器周期,但是不太理解原理,比如R7存放低八位,R6存放高八位,然后他是怎么进行减运算呢?麻烦你了:handshake
pang7 发表于 2015-5-17 11:49 | 显示全部楼层
你知道指令的机器周期 再×指令的个数 就是延时时间
 楼主| coolhongjie 发表于 2015-5-17 13:02 | 显示全部楼层
pang7 发表于 2015-5-17 11:49
你知道指令的机器周期 再×指令的个数 就是延时时间

我知道,但是还是有些迷糊,我把汇编整理一下,可以帮我讲讲如何算吗?
DELAY:        MOV R7,#0x02            ;1.09us
                MOV R6,#0x00            ;1.09us
LOOP1:        MOV A,R7                    ;1.09us
                DEC R7                  ;1.09us
                JNZ LOOP2                    ;2.18us
                DEC R6                    ;1.09us
LOOP2:        DEC A                    ;1.09us
                ORL A,R6                    ;2.18us
                JNZ LOOP1                    ;2.18us
xuyaqi 发表于 2015-5-17 16:45 | 显示全部楼层
编个程序用示波器测一下更接近真实。
ayb_ice 发表于 2015-5-18 07:56 | 显示全部楼层
while(--del);

就是这意思啊,del被分配给了R6R7,R6是高8位
mcu5i51 发表于 2015-5-18 08:56 | 显示全部楼层
KEIL 软件仿真,看用了多少周期不就好了;
再着也可以看一个运行路线,数一下就知道了呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

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