PIC单片机汇编语言求助

CursorDemoInit ;;;; Initialize USB for mouse peripheral
pagesel SoftDetachUSB
call SoftDetachUSB ; Detach from bus and reattach
pagesel Main ; with mouse report rescriptor.
ConfiguredUSB
banksel BUFFER
........
........
........

ConfiguredUSB macro
local enumloop
banksel USWSTAT
enumloop
clrwdt ; clear the watch dog timer.
movlw 0x03
andwf USWSTAT,w ; save lower 2 bits of USWSTAT
xorlw CONFIG_STATE ; compare with configured state
btfss STATUS,Z ; are we configured?
goto enumloop ; nope, keep waiting ...
endm
这段程序怎么理解,ConfiguredUSB macro这段宏在这里是怎么运作的?还有local 和macro在这里具体的作用是什么

首先,你已经知道这段是宏指令,那么macro这个伪指令就是声明这个宏指令的宏名和开始一段宏指令,知道出现endm才是结束宏。宏就类似于C语言中的函数,和汇编中的‘子程序’调用的不同的是,宏可以调用其他的宏或者调用自己(递归操作,如果你学过C语言就知道,最经典的就是做斐波那契数列)。但调用其他宏或者递归调用自己最多只能嵌套调用16次(超过就溢出)。
这样的话
ConfiguredUSB macro
。。。。
endm
其实就等于C语言中的:
void ConfiguredUSB ()
{
。。。。
}
另外宏可以带形参,比如ConfiguredUSB macro num1,num2 就等于 :
void ConfiguredUSB(uchar num1,uchar num2)
而调用宏并不需要CALL命令,而直接写宏名即可。
而local这个伪指令有点像C语言里的定义一个局部变量那样。比如写 local num1,num2
就等于C语言中的uchar num1,uchar num2.。并且,即使其他宏里或者主程序里出现num1,也不会和这个冲突,宏里面用local定义的变量只能在宏内部合法。而你这个程序里的local enumloop只是为了声明这个enumloop这个标签是宏内部的,可能在主程序里还有一个enumloop相同的标签,local是要提醒编译器不要把两个enumloop弄混乱了。

接下来说说程序,看宏名知道你这个宏是用于USB模块的设置的。banksel 还是一个伪指令,是指要跳转到USWSTAT所在的BANK,MOVLW 0X03把二进制数00000011读进工作寄存器W,然后让USWSTAT和w做与运算,其实就是要把USWSTAT的高6位都变成零,只留下低两位。结果存到W寄存器中。然后这个结果和编程者自己定义的CONFIG_STATE(可能是常量)进行比较如果相同,那么结束,不行同的话,goto到前面enumloop所指定的地方循环继续执行读USWSTAT低两位的操作。

BTW:楼上的 fbaiqd ,既然你已经会了这么多单片机,干嘛不解释解释这个程序??????
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-21
你想先学习汇编语言或C语言后,再来学习PIC单片机这个想法不可取.
我是去年暑假开始学习PIC单片机的,我之前只是在课堂上学了点微机原理和c语言,但只是学学而已,不挂科.
学习PIC单片机一定要理论和实际一起动手.也就是说你要分阶段来学,先看书只要你能写最小系统的程序就行.然后你在自己焊接扳子,做最小系统的实验.再做流水灯,数码管的显示,AD转换等等....都是理论和实践相结合.
我就是这样学的,虽然入门有点困难,但是只要入门了一个月就搞定了,之后你再学其它的单片机就简单多了.
我建议你先用汇编给PIC编程,等已经小有成就后,你在学习用C给51编程,等你学会了用C给51编程,再买本讲用C给PIC编程的书看3个小时你就会用c给PIC编程了.
一切都是理论和实践同步就行,我就是用这种方法来学单片机的,我现在已经学会了PIC\51\430\AVR了