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

ops/2025/2/9 0:45:21/

芯片手册资料

 

1. 赋值语句

C语言:

a = 5;
b = a;

汇编

; 立即数赋值
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语言:

c = a + b;
d = a - 10;

 

汇编

; 加法运算
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语言:

while (a != 0) {// 循环体a--;
}

汇编

LOOP:SZR R01       ; 判断R01(a)是否为0JP LOOP_END   ; 如果为0则跳出循环; 循环体DECR R01      ; a--JP LOOP       ; 继续循环
LOOP_END:

4. for循环

C语言:

for (int i=0; i<10; i++) {// 循环体
}

汇编

    LDIA 00H      ; 初始化i=0LD R05,A      ; R05 = iFOR_LOOP:LDIA 0AH      ; 立即数10SUBA R05      ; 10 - iSNZB STATUS,C ; 检查C标志(若i<10则C=1)JP LOOP_END   ; 若i>=10则跳出; 循环体INCR R05      ; i++JP FOR_LOOP   ; 继续循环

5. 条件判断

C语言:

if (a > b) {// 分支1
} else {// 分支2
}

汇编

    LD A,R01      ; ACC = aHSUBA R02     ; 计算a - bSNZB STATUS,C ; 检查进位C(若a>=b则C=1)JP ELSE_BLOCK; 分支1JP END_IFELSE_BLOCK:; 分支2END_IF:

6. 函数调用

C语言:

void func() {// 函数体
}func(); // 调用函数

汇编

    CALL FUNC     ; 调用函数...FUNC:; 函数体RET           ; 返回

7. 位操作

C语言:

PORTB |= 0x01;    // 置位RB0

汇编

    SETB PORTB,0  ; 直接置位PORTB的bit0

8. 移位操作

C语言:

a = a << 1;

汇编

    RLCR R01      ; 带进位循环左移(相当于左移1位)

关键差异说明:

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

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

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

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

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

完整示例:LED闪烁程序

C语言:

while (1) {PORTB ^= 0x01;  // 翻转RB0delay(1000);
}

汇编

   LDIA B'00000000'LD TRISB,A      ; 配置PORTB为输出LDIA 01H        ;翻转RB0LOOP:XORR PORTB      ; 翻转PORTB(异或操作)XORR的操作将 PORTB的值和ACC异或结果存入PORTBCALL DELAY_1S   ; 调用延时函数JP LOOPDELAY_1S:; 16MHz时钟下约1秒延时LDIA 0FFHLD R10,A
DELAY_LOOP:DECR R10SNZB STATUS,ZJP DELAY_LOOPRET

9.中断:

c语言

void int_isr(void) __interrupt
{__asm movra _abuf   swapar _STATUSmovra _statusbuf__endasm;if((INTIF)&&(INTIE)){P12D=!P12D;INTIF=0;}__asm swapar _statusbufmovra _STATUSswapr _abufswapar _abuf__endasm;
}

汇编

INT_ISR:movra   abufswapar  STATUSmovra   statusbufJBSET  	INTIFGOTO   	INT_ENDJBSET  	INTIEGOTO   	INT_ENDMOVAI  	00000100BXORRA  	P1 	   	   	   	   	;P12 翻转BCLR   	INTIF
INT_END:swapar  statusbufmovra   STATUSswapr   abufswapar  abufEND_OF_INTERRUPTRETIE  	

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

 

 


http://www.ppmy.cn/ops/156840.html

相关文章

TDengine 中如何部署集群

目 录 手动部署 部署 taosd 1. 清除数据2. 检查环境3. 安装4. 修改配置5. 启动6. 添加 dnode7. 添加 mnode 部署 taosAdapter部署 taosKeeper部署 taosX部署 taosX-Agent部署 taos-Explorer Docker 部署 启动 TDengine在 host 网络模式下启动 TDengine以指定的 hostname 和 po…

【2】Cisco SD-WAN 组件介绍

1. 概述 Cisco SD-WAN 是一套基于软件定义的广域网(SD-WAN)解决方案,能够提供安全、可扩展且高效的网络连接。它通过集中的控制和智能路径选择,实现跨多个站点的可靠性、可见性和优化。 在 Cisco SD-WAN 体系架构中,主要由四个核心组件构成: vManage(管理平面) vSmart…

Unity 2D实战小游戏开发跳跳鸟 - 跳跳鸟碰撞障碍物逻辑

在有了之前创建的可移动障碍物之后,就可以开始进行跳跳鸟碰撞到障碍物后死亡的逻辑,死亡后会产生一个对应的效果。 跳跳鸟碰撞逻辑 创建Obstacle Tag 首先跳跳鸟在碰撞到障碍物时,我们需要判定碰撞到的是障碍物,可以给障碍物的Prefab预制体添加一个Tag为Obstacle,添加步…

【拼十字——树状数组】

题目 暴力代码 30% #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; const int mod 1e9 7; int n; int l[N], w[N], c[N]; int main() {cin >> n;ll ans 0;for (int i 1; i < n; i){cin >> l[i] >> …

深入解析:Python 爬虫高级技巧与实战应用

在当今数字化时代&#xff0c;Python 爬虫已成为自动化数据抓取的核心工具。Python 拥有强大的第三方库支持&#xff0c;使得网络爬虫在数据采集领域应用广泛。本文将深入探讨 Python 爬虫的高级用法&#xff0c;包括处理反爬虫机制、动态网页抓取、分布式爬虫以及并发和异步爬…

Maven(Ⅲ)继承和聚合

Maven继承 概念 Maven继承主要用于管理项目的公共配置&#xff0c;如依赖、插件等。通过继承&#xff0c;子项目可以复用父项目的配置&#xff0c;减少重复代码&#xff0c;提高项目的可维护性。一个父项目可以有多个子项目&#xff0c;子项目可以继承父项目的 groupId、vers…

TCP/IP 邮件

TCP/IP 邮件 引言 在互联网技术飞速发展的今天,电子邮件(Email)已成为人们日常工作和生活中不可或缺的通信工具。TCP/IP协议作为互联网通信的基础,为电子邮件的传输提供了强大的技术支持。本文将详细介绍TCP/IP在电子邮件传输过程中的作用,以及相关的协议和实现方式。 …

园区网设计与实战

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识。 我是一个萌新小白&#xff0c;有误地方请大家指正&#xff0c;谢谢^_^ 文章目录 前言 这个实验主…