打印

救命啊~while(n--)不能跳出循环

[复制链接]
4802|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rezire199847|  楼主 | 2011-4-17 00:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void delay_ns(unsigned int n)
{
while(n--);
}
当我执行delay_ns(4)的时候,发现一直停在循环那里
然后我查看汇编代码,发现
    60: void delay_ns(unsigned int n)
    61: {
    62:     while(n--);
C:0x109F    EF       MOV      A,R7
C:0x10A0    1F       DEC      R7
C:0x10A1    AC06     MOV      R4,0x06
C:0x10A3    7001     JNZ      C:10A6
C:0x10A5    1E       DEC      R6
C:0x10A6    4C       ORL      A,R4
C:0x10A7    70F6     JNZ      delay_ns(C:109F)
    63: }
C:0x10A9    22       RET      


它是用R4寄存器来判断,而不是用R7寄存器来判断,但是我n的赋值是给R7的,这个问题应该怎么办???

相关帖子

沙发
123jj| | 2011-4-17 04:16 | 只看该作者
程序没错!还救啥子命? :L

重新整理如下:
    60: void delay_ns(unsigned int n)    ;字型无符合整数,存储在R6,R7中,高位在R6,低位在R7中
    61: {
    62:     while(n--);
C:0x109F    EF       MOV      A,R7       ;低位R7减一
C:0x10A0    1F       DEC      R7
C:0x10A1    AC06     MOV      R4,0x06  ;保护高位R6原值在4中
C:0x10A3    7001     JNZ      C:10A6   ;判低位R7减一后的值,不等于0, 跳转
C:0x10A5    1E       DEC      R6                  ;如等于0, 高位R6减一
C:0x10A6    4C       ORL      A,R4        ;原R6高位, 现R7低位合并(或运算)
C:0x10A7    70F6     JNZ      delay_ns(C:109F)   ;终值不等于0, 循环
    63: }
C:0x10A9    22       RET

使用特权

评论回复
板凳
icecut| | 2011-4-17 09:26 | 只看该作者
haha,不认真看贴的人

好久前这个论坛有人提出过..

你的程序很正确,就是跳不出来

使用特权

评论回复
地板
xingaiking| | 2011-4-17 11:42 | 只看该作者
不会  请楼下解决吧~~

使用特权

评论回复
5
ccmc| | 2011-4-17 12:37 | 只看该作者
弱弱的提个建议...  把‘n’改成长字符...

使用特权

评论回复
6
batsong| | 2011-4-17 13:36 | 只看该作者
根据C标准,如果不能跳出来,肯定是编译器的问题

使用特权

评论回复
7
rezire199847|  楼主 | 2011-4-17 13:37 | 只看该作者
3# icecut
之前提到的人也没解决方法吗?

使用特权

评论回复
8
rezire199847|  楼主 | 2011-4-17 13:38 | 只看该作者
5# ccmc
换成long或者char都是可以的,可是我想知道为什么?因为上午还是好好的,下午程序都没改,就莫名奇妙不能跳出循环了?程序上也没什么错误,为什么呢??

使用特权

评论回复
9
rezire199847|  楼主 | 2011-4-17 13:38 | 只看该作者
我现在暂时用4个nop代替,希望有高人知道为什么

使用特权

评论回复
10
ccmc| | 2011-4-17 13:59 | 只看该作者
本帖最后由 ccmc 于 2011-4-17 14:00 编辑
5# ccmc  
换成long或者char都是可以的,可是我想知道为什么?因为上午还是好好的,下午程序都没改,就莫名奇妙不能跳出循环了?程序上也没什么错误,为什么呢?? ...
rezire199847 发表于 2011-4-17 13:38


跟某个同名变量冲突了..

使用特权

评论回复
11
David_ming| | 2011-4-17 16:40 | 只看该作者
楼主难道用的 KEIL4 C51 ?
如果是,换成KEIL2试试

使用特权

评论回复
12
gx_huang| | 2011-4-17 16:48 | 只看该作者
局部程序没有问题,肯定是其它地方有问题。

使用特权

评论回复
13
wpj5188| | 2011-4-17 17:22 | 只看该作者
设置一下代码优化等级,或者设成速度优先

使用特权

评论回复
14
刘前辈| | 2011-4-17 20:17 | 只看该作者
本帖最后由 刘前辈 于 2011-4-17 20:18 编辑

根本没问题,main( )一启动运行,立即跳出来到0x081D 了。
C:0x0809    020817   LJMP     main(C:0817)
     9: void delay_ns(unsigned int n)
    10: {
    11: while(n--);
C:0x080C    EF       MOV      A,R7
C:0x080D    1F       DEC      R7
C:0x080E    AC06     MOV      R4,0x06
C:0x0810    7001     JNZ      C:0813
C:0x0812    1E       DEC      R6
C:0x0813    4C       ORL      A,R4
C:0x0814    70F6     JNZ      delay_ns(C:080C)
    12: }
    13:  
    14:  
    15:  
C:0x0816    22       RET      
    16:  void main()
    17: {  
    18:  
    19: delay_ns(4);
    20:  
C:0x0817    7F04     MOV      R7,#0x04
C:0x0819    7E00     MOV      R6,#0x00
C:0x081B    110C     ACALL    delay_ns(C:080C)
    21:     while(1);
C:0x081D    80FE     SJMP     C:081D
C:0x081F    22       RET      
C:0x0820    00       NOP      
、、

使用特权

评论回复
15
ahgao| | 2011-4-17 22:04 | 只看该作者
是不是有中断没处理好导致看起来是这个函数出问题啦?

使用特权

评论回复
16
lizardno1| | 2011-4-17 22:08 | 只看该作者
1# rezire199847

将unsigned int n 改成 volatile unsigned int n 就行了

使用特权

评论回复
17
mbutterfly| | 2011-4-17 22:46 | 只看该作者
3楼说说为什么好不。

使用特权

评论回复
18
rezire199847|  楼主 | 2011-4-18 19:56 | 只看该作者
17# mbutterfly
为什么呢?

使用特权

评论回复
19
rezire199847|  楼主 | 2011-4-18 20:00 | 只看该作者
1# rezire199847  

将unsigned int n 改成 volatile unsigned int n 就行了
lizardno1 发表于 2011-4-17 22:08


为什么啊

使用特权

评论回复
20
wang_2003| | 2011-4-21 09:20 | 只看该作者
就是这个是为什么呢?

使用特权

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

本版积分规则

0

主题

60

帖子

1

粉丝