打印
[PIC®/AVR®/dsPIC®产品]

从汇编代码中访问寄存器

[复制链接]
883|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 的中档汇编模块的示例。
#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



使用特权

评论回复
沙发
huangcunxiake|  楼主 | 2024-3-11 23:15 | 只看该作者
必须小心确保您不会破坏存放计算中间值的寄存器的内容。一些寄存器由编译器使用,直接写入这些寄存器可导致代码失败。

使用特权

评论回复
板凳
huangcunxiake|  楼主 | 2024-3-11 23:15 | 只看该作者
当 SFR 由于汇编代码写入它们而发生改变时,代码生成器并不会检测到发生了这种情况。

使用特权

评论回复
地板
lix1yr| | 2024-3-27 12:31 | 只看该作者
现在还有用汇编编写代码的啊?

使用特权

评论回复
5
盗铃何须掩耳| | 2024-3-27 13:06 | 只看该作者
汇编写会不会太难了

使用特权

评论回复
6
d1ng2x| | 2024-3-27 13:44 | 只看该作者
我觉得可以直接选择使用C语言比较好吧

使用特权

评论回复
7
q1ngt12| | 2024-3-27 14:53 | 只看该作者
在汇编语言中,访问寄存器通常是通过使用寄存器的名称来实现的

使用特权

评论回复
8
p0gon9y| | 2024-3-27 16:24 | 只看该作者
感觉汇编好难啊,而且很枯燥无味,不是么

使用特权

评论回复
9
p0gon9y| | 2024-3-27 17:42 | 只看该作者
原来汇编操作也需要头文件的啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

204

主题

3476

帖子

10

粉丝