如果编写独立的汇编模块, SFR 定义将不会自动可访问。可以通过使用汇编头文件<xc.inc> 来访问这些寄存器的定义。对于嵌入到 C 代码中的汇编代码,请不要使用该文件,因为它会与 <xc.h> 中的定义发生冲突。
使用汇编器的 INCLUDE 伪指令或使用 C 预处理器的 #include 伪指令来包含该文件。如果使用后一种方法,请确保使用驱动程序选项-P 进行编译,以便对汇编文件进行预处理。
该头文件中的寄存器符号类似于在包含<xc.h>时在C域中使用的标识符,例如PORTA和 EECON1 等。它们是不同域中的不同符号,但会映射到相同的存储单元。
寄存器内的位被定义为registerName,bitNumber。例如,RA0被定义为PORTA,0。
以下给出了一个使用 SFR 的中档汇编模块的示例。
#include <xc.inc>
GLOBAL _setports
PSECT text,class=CODE,local,delta=2
_setports:
MOVLW 0xAA
BANKSEL (PORTA)
MOVWF BANKMASK(PORTA)
BANKSEL (PORTB)
BSF RB1
如果要从嵌入到 C 代码的汇编代码中访问寄存器定义,要确保将 头文件包含到 C 模块中。此头文件包含的信息将定义嵌入汇编符号以及可从 C 代码访问的常用符号。用于寄存器名称的符号将与由 定义的相同。因此,例如,前面给出的示例可以重写为如下形式的嵌入汇编代码。
#asm
MOVLW 0xAA
BANKSEL (PORTA)
MOVWF BANKMASK(PORTA)
BANKSEL (PORTB)
BSF RB1
#endasm
|