在下面的代码中,我设置了 TRIS 寄存器的第一个位,然后是第二位,然后是第三位,最后是第四位。为什么生成的汇编代码……奇怪?
很高兴知道:编译代码的微控制器的数据存储器分为几个存储区。位 6 和 7 进入status
寄存器的位置 5 和 6,只有位 0-5 存储在操作码中。因此,当访问TRIS
位置 0x86 的寄存器时,存储在操作码中的值是6
.
具体问题:
(134)^080
: 这转换为6
,这是TRIS
特定银行的地址。为什么编译器不只写(6)
or(134)
?只是为了明确TRIS不在bank 0上,还是有其他原因?+(0/8)
:0
代表位位置,8
表示该寄存器中的总位数。在我看来,这个表达式没有任何用途,因为结果总是一个分数,而不是一个整数。因此它对地址计算没有贡献。(0)&7
:再次代表位位置,但我一直不清楚(0)
二进制与服务的目的。7
- 命令有什么作用
line
?
代码(从生成的 *.as 文件中提取)
;main.c: 9: TRISB |= 1;
bsf status, 5 ;RP0=1, select bank1
bcf status, 6 ;RP1=0, select bank1
bsf (134)^080h+(0/8),(0)&7 ;volatile
line 10
;main.c: 10: TRISB |= 2;
bsf (134)^080h+(1/8),(1)&7 ;volatile
line 11
;main.c: 11: TRISB |= 4;
bsf (134)^080h+(2/8),(2)&7 ;volatile
line 12
;main.c: 12: TRISB |= 8;
bsf (134)^080h+(3/8),(3)&7 ;volatile
line 13