c语言对应汇编写法(以中微单片机举例)

芯片手册资料

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位)

关键差异说明:

  1. 寄存器分配:需要手动管理128字节RAM中的寄存器(如R00-R7F)

  2. 状态标志 :需通过STATUS寄存器判断运算结果(Z/C/DC标志)

  3. 跳转范围JP指令只能跳转当前页(256地址范围),跨页需操作PCLATH

  4. 函数调用:无自动堆栈保护,需手动保存关键寄存器(ACC/STATUS)

  5. 延时循环:需通过定时器或精确计算指令周期实现

完整示例: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  	

汇编指令的用法看数据手册,可以进行对比,有什么错误大家也可以指正~

相关推荐
半桔24 分钟前
排序时间的复杂度和稳定性
c语言·数据结构·c++·算法·排序算法
墨楠。27 分钟前
C语言数据结构编程练习-排序算法
c语言·数据结构·学习
嘻嘻哈哈的zl2 小时前
初阶数据结构:树---堆
c语言·数据结构
egoist20233 小时前
链式结构二叉树(递归暴力美学)
c语言·开发语言·数据结构·学习·链表·二叉树·前中后序遍历
waves浪游4 小时前
C++模板初阶
c语言·开发语言·数据结构·c++·算法
海绵丿星星6 小时前
【C语言】常量指针和指针常量,指针数组和数组指针,指针函数和函数指针怎么区分?
c语言·数据结构·算法
Heris9911 小时前
c语言——网络编程概述、socket【套接字的创建、ip和port写入套接字、通过套接字文件读取和发送数据】
c语言·网络·tcp/ip
kim_puppy12 小时前
树的基本概念,并查集复习(学习记录)
c语言·数据结构·学习·算法
Stark、13 小时前
【Linux系统编程】进程间通信(管道:匿名管道、命名管道、实战练习)
linux·运维·服务器·c语言·后端