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  	

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

相关推荐
啊?啊?36 分钟前
C/C++练手小项目之倒计时与下载进度条模拟
c语言·开发语言·c++
超级大福宝9 小时前
使用 LLVM 16.0.4 编译 MiBench 中的 patricia遇到的 rpc 库问题
c语言·c++
闭着眼睛学算法12 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
麦麦在写代码13 小时前
动态内存管理 干货2
c语言
say_fall13 小时前
C语言底层学习(2.指针与数组的关系与应用)(超详细)
c语言·开发语言·学习
祐言QAQ14 小时前
(超详细,于25年更新版) VMware 虚拟机安装以及Linux系统—CentOS 7 部署教程
linux·运维·服务器·c语言·物联网·计算机网络·centos
Ziyoung14 小时前
【探究】C语言-类型转换问题
c语言
JasmineX-116 小时前
数据结构——静态链表(c语言笔记)
c语言·数据结构·链表
学不动CV了17 小时前
ARM单片机中断及中断优先级管理详解
c语言·arm开发·stm32·单片机·嵌入式硬件·51单片机
番茄大杀手18 小时前
C/C++柔性数组
c语言·柔性数组