Keil 51 Asm & C 混搭
2018-10-17 来源:eefocus
对应的文件选中“Generate Assembler SRC File”和“Assemble SRC File”选项,注意源先这两项是灰色选中,鼠标点击后将其确认为黑色选中状态。
(可选)同时编译的时候确保相应的库在Source Group下,如small模式,则加入C51S.lib到项目下。
Keil在DEBUG模式下,右键菜单“Load Hex or Object file ...”可有反汇编外部二进制模块的功能。其实IDA5.x/6.x的对单片机的支持相当不错了,没有误码。其他的反汇编工具多少都有错误的代码译出,IDA对付花指令相当有效。
以下混编例程是一款 红外逻辑分析仪的反汇编整理后的程序。原程序只有HEX码,反编译后加入了C结构,原ASM码的效率高些,但在STC 一周期指令的芯片上基本可以忽略。
原 红外逻辑分析仪 界面
#include
//汇编改写定时器0中断,编译会有CodeOverlay的警告信息,可以忽略,C结构的main入口由STARTUP.A51定义
#pragma ASM
ORG 000BH
LJMP TIMER0
#pragma ENDASM
#define FOSC 22118400L
sbit LED_FLASH=P1^3;
//可以部署在DATA,IDATA数据区
unsigned int ms_count=1000;
void i_exint0() interrupt 0 using 0{ //使用寄存器组,可以实现快速的压/出栈
#pragma ASM
SETB TR0
CLR 0x90.2
CLR TI
SETB ES
MOV SBUF,0x20
MOV 0x20,#0x00
SETB 0x21.7
JNB INT0,$
CLR TI
SETB ES
MOV SBUF,0x20
MOV 0x20,#0x00
#pragma ENDASM
}
void i_serial() interrupt 4 using 0{
#pragma ASM
CLR TI
CLR ES
MOV SBUF,0x21
MOV 0x21,#0x00
#pragma ENDASM
}
#pragma ASM
TIMER0:
MOV A,0x20
ADD A,#0x01
MOV 0x20,A
MOV A,0x21
ADDC A,#0x00
MOV 0x21,A
JNB 0x21.5,_TIMER0_RET
CLR TR0
SETB 0x90.2
MOV 0x20,#0x00
MOV 0x21,#0x00
_TIMER0_RET:
RETI
#pragma ENDASM
void main(void){
SCON=0x40;
TMOD=0x22;
TH1=0xff;
TL1=0xff;
TH0=0xdb;
TL0=0xdb;
PCON=0x80;
#pragma ASM //bdata 数据区
MOV 0x20,#0x00
MOV 0x21,#0x80
#pragma ENDASM
EA=1;
EX0=1;
IT0=0;
ET0=1;
TR1=1;
PS=1;
PT0=1;
INT0=1;
TR0=1;
while(1){ }
}
- keil中GD32 MCU IAP中APP的存储地址如何设置?
- 如何查看GD32 Keil和IAR工程的map文件
- GD32开发实战指南(基础篇) 第4章 GD32启动流程详解(Keil版)
- 如何使用Keil打开GD32 FPU及使用ARM DSP库 ?
- 【GD32 MCU 入门教程】一、GD32 MCU 开发环境搭建(1)使用Keil开发GD32
- STM32 FreeRTOS Keil环境搭建
- 用Keil编译STM32工程出现下面错误
- 基于STM32的Keil和偏移地址程序存储
- STM32通过命令行编译和下载keil和IAR工程的方法
- ch32可以用keil吗?ch32和stm32编程有区别吗?