本帖最后由 刘前辈 于 2011-8-27 13:31 编辑
#24楼
刘前辈确实是绝顶聪明的超宇宙级高手,俺菜鸟只有在后面跟班学习的份,试着改写了一段刘前辈最拿手的标准51程序,反汇编结果如下,请刘前辈指教。
M0版主真是认真的人,终于看出刘前辈的CY 不是中断ISR 里的CY 了——是自己用户程序里用来自测试的CY;值得庆贺一番,我请你吃饭,一天长进了3年!
我还奇怪一点,如若我的CY 如你所想,是count 过0 进位时,ISR的行为,那前辈还一直充什么第一?HotPower等前辈早就指出来了,刘前辈经他们提示,照抄他们的思想?然后说自己是原创? 呵呵,前辈从不干那种事……若有一个人跟刘前辈想的一样,刘前辈必然会再想出一个与所有人不一样的方法来,……笑话所长如今只会骂粗口,昔日裸奔大腕,自诩“天下第一”,如今连一个与中断无关的裸奔方法也想不出来啦,昔日黄花,“要尊重老人……”
今天早上一小时已经理论上完成了 ||CY 的证明。不用花多少天,写出来谁都不高兴,提示一下:
CY应该永远等于0而不是 1 。因为count 按理不会小于250 ;所以正如你上面一框所说CY=0,跳转至“……”。Smartpower已经告诉大家“按道理一定(CY=0)执行这句话”。而CY=1属于非正常的随机偶然情况,——不应该出现的、导致程序出错的异常情况。 何时成了CY永远=1 ?
见下面:
67:
68: if( count > 250) //count = 251~260
C:0x0853 D3 SETB C
C:0x0854 E509 MOV A,0x09
C:0x0856 94FA SUBB A,#0xFA
C:0x0858 E508 MOV A,count(0x08)
C:0x085A 9400 SUBB A,#0x00
C:0x085C 4007 JC C:0865 //异常情况,万分之 n 的概率。
69: { //
70: delay(2); // 按理一定执行这句话
C:0x085E 7F02 MOV R7,#0x02
C:0x0860 1208CB LCALL delay(C:08CB)
71: }
72: else
C:0x0863 80B7 SJMP C:081C
73: {
74: error++; //但实际上有一定的机率会执行这句话
C:0x0865 AF11 MOV R7,0x11
C:0x0867 AE10 MOV R6,0x10
C:0x0869 AD0F MOV R5,0x0F
C:0x086B AC0E MOV R4,error(0x0E)
既然 JC &error 是由于中断ISR引起的不正常状况,而且SmartPower 已经写出了测试语句,想办法把它阻塞掉,当然用CY最简单:
66:
67:
68: if( count > 250||CY ) //count = 251~260
C:0x0853 D3 SETB C
C:0x0854 E509 MOV A,0x09
C:0x0856 94FA SUBB A,#0xFA
C:0x0858 E508 MOV A,count(0x08)
C:0x085A 9400 SUBB A,#0x00
C:0x085C 5003 JNC C:0861 // 正常情况跳走了,下面语句是异常概率。不影响正常执行程序。
C:0x085E 30D707 JNB CY(0xD0.7),C:0868 // 潜伏异常检测语句
69: { //
70: delay(2); // 按理一定执行这句话
C:0x0861 7F02 MOV R7,#0x02
C:0x0863 1208CE LCALL delay(C:08CE)
71: }
72: else
C:0x0866 80B4 SJMP C:081C
73: {
74: error++; // 但实际上有一定的机率会执行这句话
C:0x0868 AF11 MOV R7,0x11
C:0x086A AE10 MOV R6,0x10
C:0x086C AD0F MOV R5,0x0F
、、 |