zky2003的笔记 https://passport2.21ic.com/?202876 [收藏] [复制] [RSS] love life ,love blog :-)

日志

8051汇编程序注意的问题

已有 1494 次阅读2008-6-25 17:20 |系统分类:单片机| 8051汇编

原来一直用C语言来写8051的程序,最近跑到客户这边,发现开发工程师还是很习惯汇编的开发。原来自己的写的代码用不了,只有好好把汇编看看一看。在写汇编期间发现一些需要注意的问题,正好记录下来,和大家分享,虽然很低级的错误,给初学的人还是很有教益的。


1)对SP指针的修改。SP指向的8051RAM空间的地址,在系统上电之后SP指向07H,在这里你可以根据自己的程序的大小来修改,只是千万要注意的是------------!!!!不要在子程序修改SP的值,本人就范过这种低级的错误,软件仿真时,调用这个子程序后就发生复位,开始没有在意,因为我用的8051不是标准的8051,开始一位时Watchdog引起的复位。后来程序烧录下去总异常。最好才发现这个很傻傻滴问题。


2)中断函数里注意对现场的保护。当系统中断发生时,如果在中断里没有对相关的寄存器或者变量压入堆栈,然后在中断服务程序里又不小心修改了这些值,那么麻烦很快就来了。当中断结束之后,返回到主程序里时,主程序里的值很可能倍中断服务程序修改,引起程序的异常。 下面的例子也是我经历过的。


         主程序里定义了一个delay的子函数:


;-----------------------------------------------------------------------------------------------------------   


         delay:


            mov               r6 , #64h


delay_1      :


             mov               r5 ,#64h


delay_2     :


             nop


             djnz                 r5  ,delay_2


              djnz                r6  ,delay_1


              ret


;-----------------------------------------------------------------------------------------------------------


然而,在中断服务程序里,不小心又把R5,或者R6的值改变了,这样就很又可能到时程序在delay函数里死循环。所以对汇编的中断的现场保护要相当的注意才行,用C51习惯了,人就变懒了。


3)      clr     指令


           也是容易出错的地方,可能是不同体系的MCU语言不一样,把工程师都搞糊涂了,受PIC指令的影响,本来想清一个RAM变量,在PIC里直接CLR     MEM, 搞定,在8051里不能这么用了,还是老老实实的   CLR     A  ; MOV       MEM ,A 吧,要不然在8051里 CLR     MEM  ,清的可是 bit空间的地址,和实际要清除RAM空间不一样了。


4)      间接寻址的◎


           PIC就是一个地址空间,8051不一样,高128字节的RAM和寄存器地址重叠。在写程序的时候不留神就把写RAM的指令直接写到特殊寄存器里去。所以在做程序的时候还是要留意一下自己写的指令的寻址方式是否对。


 


           古话说的好,小心驶的万年船啊,做程序真的要小心翼翼的才行,要不然经常会范很傻很低级的错误


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)