芯片手册资料
1. 赋值语句
C语言:
cpp
a = 5;
b = a;
汇编:
cpp
; 立即数赋值
LDIA 05H ; ACC = 5
LD R01,A ; R01 = ACC(a=5)
; 寄存器间赋值
LD A,R01 ; ACC = R01(读取a的值)
LD R02,A ; R02 = ACC(b=a)
2. 算术运算
C语言:
cpp
c = a + b;
d = a - 10;
汇编:
cpp
; 加法运算
LD A,R01 ; ACC = a
ADDA R02 ; ACC = a + b
LD R03,A ; c = ACC
; 减法运算
LD A,R01 ; ACC = a
SUBIA 0AH ; ACC = a - 10
LD R04,A ; d = ACC
3. while循环
C语言:
cpp
while (a != 0) {
// 循环体
a--;
}
汇编:
cpp
LOOP:
SZR R01 ; 判断R01(a)是否为0
JP LOOP_END ; 如果为0则跳出循环
; 循环体
DECR R01 ; a--
JP LOOP ; 继续循环
LOOP_END:
4. for循环
C语言:
cpp
for (int i=0; i<10; i++) {
// 循环体
}
汇编:
cpp
LDIA 00H ; 初始化i=0
LD R05,A ; R05 = i
FOR_LOOP:
LDIA 0AH ; 立即数10
SUBA R05 ; 10 - i
SNZB STATUS,C ; 检查C标志(若i<10则C=1)
JP LOOP_END ; 若i>=10则跳出
; 循环体
INCR R05 ; i++
JP FOR_LOOP ; 继续循环
5. 条件判断
C语言:
cpp
if (a > b) {
// 分支1
} else {
// 分支2
}
汇编:
cpp
LD A,R01 ; ACC = a
HSUBA R02 ; 计算a - b
SNZB STATUS,C ; 检查进位C(若a>=b则C=1)
JP ELSE_BLOCK
; 分支1
JP END_IF
ELSE_BLOCK:
; 分支2
END_IF:
6. 函数调用
C语言:
cpp
void func() {
// 函数体
}
func(); // 调用函数
汇编:
cpp
CALL FUNC ; 调用函数
...
FUNC:
; 函数体
RET ; 返回
7. 位操作
C语言:
cpp
PORTB |= 0x01; // 置位RB0
汇编:
cpp
SETB PORTB,0 ; 直接置位PORTB的bit0
8. 移位操作
C语言:
cpp
a = a << 1;
汇编:
cpp
RLCR R01 ; 带进位循环左移(相当于左移1位)
关键差异说明:
-
寄存器分配:需要手动管理128字节RAM中的寄存器(如R00-R7F)
-
状态标志 :需通过
STATUS
寄存器判断运算结果(Z/C/DC标志) -
跳转范围 :
JP
指令只能跳转当前页(256地址范围),跨页需操作PCLATH
-
函数调用:无自动堆栈保护,需手动保存关键寄存器(ACC/STATUS)
-
延时循环:需通过定时器或精确计算指令周期实现
完整示例:LED闪烁程序
C语言:
cpp
while (1) {
PORTB ^= 0x01; // 翻转RB0
delay(1000);
}
汇编:
cpp
LDIA B'00000000'
LD TRISB,A ; 配置PORTB为输出
LDIA 01H ;翻转RB0
LOOP:
XORR PORTB ; 翻转PORTB(异或操作)XORR的操作将 PORTB的值和ACC异或结果存入PORTB
CALL DELAY_1S ; 调用延时函数
JP LOOP
DELAY_1S:
; 16MHz时钟下约1秒延时
LDIA 0FFH
LD R10,A
DELAY_LOOP:
DECR R10
SNZB STATUS,Z
JP DELAY_LOOP
RET
9.中断:
c语言:
cpp
void int_isr(void) __interrupt
{
__asm
movra _abuf
swapar _STATUS
movra _statusbuf
__endasm;
if((INTIF)&&(INTIE))
{
P12D=!P12D;
INTIF=0;
}
__asm
swapar _statusbuf
movra _STATUS
swapr _abuf
swapar _abuf
__endasm;
}
汇编:
cpp
INT_ISR:
movra abuf
swapar STATUS
movra statusbuf
JBSET INTIF
GOTO INT_END
JBSET INTIE
GOTO INT_END
MOVAI 00000100B
XORRA P1 ;P12 翻转
BCLR INTIF
INT_END:
swapar statusbuf
movra STATUS
swapr abuf
swapar abuf
END_OF_INTERRUPT
RETIE
汇编指令的用法看数据手册,可以进行对比,有什么错误大家也可以指正~