[PIC®/AVR®/dsPIC®产品] 从汇编代码中访问寄存器

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



 楼主| huangcunxiake 发表于 2024-3-11 23:15 | 显示全部楼层
必须小心确保您不会破坏存放计算中间值的寄存器的内容。一些寄存器由编译器使用,直接写入这些寄存器可导致代码失败。
 楼主| huangcunxiake 发表于 2024-3-11 23:15 | 显示全部楼层
当 SFR 由于汇编代码写入它们而发生改变时,代码生成器并不会检测到发生了这种情况。
lix1yr 发表于 2024-3-27 12:31 | 显示全部楼层
现在还有用汇编编写代码的啊?
盗铃何须掩耳 发表于 2024-3-27 13:06 | 显示全部楼层
汇编写会不会太难了
d1ng2x 发表于 2024-3-27 13:44 | 显示全部楼层
我觉得可以直接选择使用C语言比较好吧
q1ngt12 发表于 2024-3-27 14:53 | 显示全部楼层
在汇编语言中,访问寄存器通常是通过使用寄存器的名称来实现的
p0gon9y 发表于 2024-3-27 16:24 | 显示全部楼层
感觉汇编好难啊,而且很枯燥无味,不是么
p0gon9y 发表于 2024-3-27 17:42 | 显示全部楼层
原来汇编操作也需要头文件的啊

您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

3700

帖子

11

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

222

主题

3700

帖子

11

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