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

[复制链接]
5847|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 | 显示全部楼层
不会  请楼下解决吧~~
ccmc 发表于 2011-4-17 12:37 | 显示全部楼层
弱弱的提个建议...  把‘n’改成长字符...
batsong 发表于 2011-4-17 13:36 | 显示全部楼层
根据C标准,如果不能跳出来,肯定是编译器的问题
 楼主| rezire199847 发表于 2011-4-17 13:37 | 显示全部楼层
3# icecut
之前提到的人也没解决方法吗?
 楼主| rezire199847 发表于 2011-4-17 13:38 | 显示全部楼层
5# ccmc
换成long或者char都是可以的,可是我想知道为什么?因为上午还是好好的,下午程序都没改,就莫名奇妙不能跳出循环了?程序上也没什么错误,为什么呢??
 楼主| rezire199847 发表于 2011-4-17 13:38 | 显示全部楼层
我现在暂时用4个nop代替,希望有高人知道为什么
ccmc 发表于 2011-4-17 13:59 | 显示全部楼层
本帖最后由 ccmc 于 2011-4-17 14:00 编辑
5# ccmc  
换成long或者char都是可以的,可是我想知道为什么?因为上午还是好好的,下午程序都没改,就莫名奇妙不能跳出循环了?程序上也没什么错误,为什么呢?? ...
rezire199847 发表于 2011-4-17 13:38


跟某个同名变量冲突了..
David_ming 发表于 2011-4-17 16:40 | 显示全部楼层
楼主难道用的 KEIL4 C51 ?
如果是,换成KEIL2试试
gx_huang 发表于 2011-4-17 16:48 | 显示全部楼层
局部程序没有问题,肯定是其它地方有问题。
wpj5188 发表于 2011-4-17 17:22 | 显示全部楼层
设置一下代码优化等级,或者设成速度优先
刘前辈 发表于 2011-4-17 20:17 | 显示全部楼层
本帖最后由 刘前辈 于 2011-4-17 20:18 编辑

根本没问题,main( )一启动运行,立即跳出来到0x081D 了。
  1. C:0x0809    020817   LJMP     main(C:0817)
  2.      9: void delay_ns(unsigned int n)
  3.     10: {
  4.     11: while(n--);
  5. C:0x080C    EF       MOV      A,R7
  6. C:0x080D    1F       DEC      R7
  7. C:0x080E    AC06     MOV      R4,0x06
  8. C:0x0810    7001     JNZ      C:0813
  9. C:0x0812    1E       DEC      R6
  10. C:0x0813    4C       ORL      A,R4
  11. C:0x0814    70F6     JNZ      delay_ns(C:080C)
  12.     12: }
  13.     13:  
  14.     14:  
  15.     15:  
  16. C:0x0816    22       RET      
  17.     16:  void main()
  18.     17: {  
  19.     18:  
  20.     19: delay_ns(4);
  21.     20:  
  22. C:0x0817    7F04     MOV      R7,#0x04
  23. C:0x0819    7E00     MOV      R6,#0x00
  24. C:0x081B    110C     ACALL    delay_ns(C:080C)
  25.     21:     while(1);
  26. C:0x081D    80FE     SJMP     C:081D
  27. C:0x081F    22       RET      
  28. C:0x0820    00       NOP      
、、
ahgao 发表于 2011-4-17 22:04 | 显示全部楼层
是不是有中断没处理好导致看起来是这个函数出问题啦?
lizardno1 发表于 2011-4-17 22:08 | 显示全部楼层
1# rezire199847

将unsigned int n 改成 volatile unsigned int n 就行了
mbutterfly 发表于 2011-4-17 22:46 | 显示全部楼层
3楼说说为什么好不。
 楼主| rezire199847 发表于 2011-4-18 19:56 | 显示全部楼层
17# mbutterfly
为什么呢?
 楼主| rezire199847 发表于 2011-4-18 20:00 | 显示全部楼层
1# rezire199847  

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


为什么啊
wang_2003 发表于 2011-4-21 09:20 | 显示全部楼层
就是这个是为什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

60

帖子

1

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