PIC汇编rlf指令行为异常咨询(MPLAB IDE v8.92)
PIC汇编rlf指令行为异常的原因分析
问题背景
在Windows 11系统的MPLAB IDE v8.92中,针对PIC16F877编写汇编代码时,发现rlf指令行为不符合预期:
- 已知j和k的值均为0xFF,
addwf k,W运算后状态寄存器的进位标志C被置1 - 执行
rlf W,1时,W寄存器保持0x00不变 - 执行
rlf W,0时,W寄存器变为0x01(符合理论预期)
核心原因
这是因为PIC16系列单片机的指令集规则限制:rlf f,d指令中,当d=1时,要求将运算结果写回操作数f,但f必须是文件寄存器(File Register),而W寄存器不属于文件寄存器范畴,因此rlf W,1是非法语法。
MPLAB v8.92的汇编器未对该非法写法报错,但实际执行时该指令不会产生任何操作,W寄存器的值保持为之前movlw 0x00设置的0x00。
而rlf W,0是合法用法:d=0表示将运算结果存入W寄存器,此时对W(0x00)左移,进位C=1被移入最低位,结果为0x01,符合预期。
代码验证
你的测试代码如下:
processor 16f877 ;指定处理器型号 include "p16f877.inc" ;加载处理器头文件 j equ 0x26 ;定义j为地址0x26的别名 k equ 0x27 ;定义k为地址0x27的别名 c1 equ 0x28 ;定义c1为地址0x28的别名 r1 equ 0x29 ;定义r1为地址0x29的别名 org 0x00 ;程序起始向量 goto start ;跳转到start标签 org 0x05 ;从地址0x05开始编写程序 start: movf j,W ;将j的值移入W寄存器 addwf k,W ;k的值与W相加,结果存入W,此时进位C=1 movwf r1 ;将W的值存入r1 movlw 0x00 ;W寄存器设置为0x00 rlf W,1 ;rlf W,0 ;rlf W,1为非法指令,无操作;rlf W,0合法,W变为0x01 movwf c1 end ;程序结束
截图说明:
- 使用
rlf W,1时:W寄存器保持0x00,进位C仍为1,指令未执行有效操作 - 使用
rlf W,0时:W寄存器变为0x01,符合左移运算+进位移入的结果
修正方案
如果需要将rlf的运算结果写回寄存器,应选择文件寄存器作为操作数,示例代码如下:
movlw 0x00 movwf c1 ;将0x00存入文件寄存器c1 rlf c1,1 ;对c1执行rlf操作,结果写回c1,此时c1的值为0x01 movf c1,W ;将c1的值移入W寄存器
内容的提问来源于stack exchange,提问作者Adolf RJ
相关产品推荐
相关产品推荐

