当前位置: 首页 > news >正文

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

芯片手册资料

 

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.lryc.cn/news/532495.html

相关文章:

  • 详解CSS `clear` 属性及其各个选项
  • 算法设计与分析三级项目--管道铺设系统
  • Page Assist - 本地Deepseek模型 Web UI 的安装和使用
  • VMware Win10下载安装教程(超详细)
  • DS目前曲线代替的网站汇总
  • 具有HiLo注意力的快速视觉Transformer
  • 《AI “造脸术”:生成对抗网络打造超真实虚拟人脸》
  • 2025.2.6总结
  • RK3576——USB3.2 OTG无法识别到USB设备
  • 低代码系统-插件功能分析( 某道云)
  • 如何在 FastAPI 中使用本地资源自定义 Swagger UI
  • wxWidgets生成HTML文件,带图片转base64数据
  • 基于ArcGIS的SWAT模型+CENTURY模型模拟流域生态系统水-碳-氮耦合过程研究
  • 一键掌握多平台短视频矩阵营销/源码部署
  • 2.Python基础知识:注释、变量以及数据类型、标识符和关键字、输入函数、输出函数、运算符、程序类型转换
  • 3NF讲解
  • Spring Boot框架下的单元测试
  • AI测试工程师成长指南:以DeepSeek模型训练为例
  • 【数据结构】_队列的结构与实现
  • 机器学习--2.多元线性回归
  • MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)
  • 朴素贝叶斯原理
  • k8s中,一.pod污点,二.pod容器污点容忍策略,三.pod优先级(PriorityClass类)
  • 【重生之学习C语言----水仙花篇】
  • 两步构建 AI 总结助手,实现智能文档摘要
  • 承压金字塔(蓝桥杯17C)
  • day33-数据同步rsync
  • Android 实现首页Tab切换并且支持懒加载功能详解
  • [Android] 360行车记录仪谷歌版
  • 基于Redis分布式锁