KEILC51中C语言加入汇编语言的使用方法
深入剖析keilc51---从汇编到c51

深入剖析keilc51---从汇编到c51C插入汇编语句#pragma asmljmp 0#pragma endasm如果就这样直接编译的话,会出现以下错误:error C272: 'asm/endasm' requires src-control to be active解决方法:在 Files T oolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assemble SRC File 的勾选由灰色变为黑色,即使这两项有效!第一节 main()函数和启动代码汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接。
下面看看它和main()函数是如何编译的;//主函数如下;void main(void){while (1) 这是个无条件空循环。
{}}把上面的main()函数编译后的汇编程序和反汇编代码整理后对照如下;C_C51STARTUP SEGMENT CODEPR?main?TESTMAIN SEGMENT CODESTACK SEGMENT IDATARSEG ?STACKDS 1CSEG AT 0C_STARTUP: LJMP STARTUP1C:0x0000 020003 LJMP STARTUP1(C:0003)RSEG ?C_C51STARTUPSTARTUP1: ;该段程序把内存清零; MOV R0,#IDATALEN - 1C:0x0003 787F MOV R0,#0x7F; CLR AC:0x0005 E4 CLR A; MOV @R0,AIDATALOOP:C:0x0006 F6 MOV @R0,A; DJNZ R0,IDATALOOPC:0x0007 D8FD DJNZ R0,IDATALOOP(C:0006); MOV SP,#?STACK-1 ;设制CPU的堆栈起始地址C:0x0009 758107 MOV SP(0x81),#0x07; LJMP ?C_STARTC:0x000C 02000F LJMP main(C:000F)RSEG ?PR?main?TESTMAINmain:; void main(void)C:0x000F 80FE SJMP main(C:000F) ;main()函数现在分析上面的汇编程序就会明白c51程序是如何启动的。
KEIL C51 中 C语言加入汇编语言的使用方法

KEIL C51 中C语言加入汇编语言的使用方法
51单片机2008-06-03 18:20:42 阅读22 评论0字号:大中小
1.通过使用预处理指令#asm 和#endasm来使用汇编语言。
用户编写的汇编语言可以紧跟在#asm之后,而在#endasm之前结束。
如下所示:
#asm
/*汇编源程序*/
#endasm
在#asm和#endasm之间的语句将作为汇编语言的语句输出到由编译器产生的汇编语言文件中。
2.通过使用预处理指令# pragma asm和函数_asm()来使用汇编语言。
在程序的开头加上预处理指令#pragma asm,在该预处理指令之前只能有注释和其它预处理指令。
_asm()函数可按以下方式使用。
_asm(汇编语言字符串)
在汇编语言字符串中,可以通过回车和换行符把各个语句分开。
在C语言中使用汇编语言,可以操作C语言中的全局变量或完成用C语言难于完成的功能,但要注意以下几点:
①#asm不允许嵌套使用。
②当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件。
③ _asm只能用小写字母,如果写成大写,就作为普通变量。
④#asm#endasm和_asm只能用在函数内。
Keil C51中嵌入汇编

转载请注明出处谢谢
Keil C51中嵌入汇编
我们知道,用C语言实现精确延时是一件比较困难的事情,而用汇编写精确延时程序就简单多了,但是整个程序都用汇编,那就是件头疼的事情。
要是能在C里面嵌入汇编,那就爽了,本文介绍的就是如何在Keil C51里嵌入汇编。
1、在C 文件中以如下方式加入汇编代码:
#pragma ASM
; Assembler Code Here
#pragma ENDASM
例如:
//延时1ms程序晶振:11.0592MHZ
void delay_1ms(void)
{
#pragma asm
DELAY1MS: MOV R7,#50
DD: MOV R6,#10
D2: DJNZ R6,$
DJNZ R7,DD
#pragma endasm
}
2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右
边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色
(有
效)状态。
如图所示。
3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件。
4、编译,即可生成目标代码。
keil c语言转汇编

keil c语言转汇编
在Keil C中,可以使用内置的编译器和调试器将C语言代码转换为汇编代码。
以下是将C语言代码转换为汇编代码的步骤:
1.打开Keil C并创建一个新的C项目。
2.在项目中创建一个C源文件(.c文件),并将的C代码写在这个文件中。
3.在Keil C的菜单栏中,选择“Project” > “Options for Target”。
4.在弹出的对话框中,选择“C/C++”选项卡。
5.在“C Compiler”下拉菜单中,选择要使用的编译器。
通常情况下,可以选择“ARM”或“C51”编译器,具体取决于的目标硬件。
6.在“Output”下拉菜单中,选择“Assemble only”选项。
这将指示编译器只生成汇编代码而不进行编译。
7.点击“OK”保存设置。
8.在Keil C的菜单栏中,选择“Project” > “Build Target”。
这将使用选定的编译器将的C代码编译为汇编代码。
9.编译过程完成后,打开生成的目标文件(.obj文件)。
10.在目标文件中,将找到已转换为汇编代码的C代码。
可以使用文本编辑器打开目标文件并查看其中的汇编代码。
请注意,转换后的汇编代码可能会被优化和重排,以适应目标硬件的要求。
因此,生成的汇编代码可能与在C源文件中编写的代码有所不同。
C51编程keil c6.20c 直接嵌入汇编的方法

x)
Untitled Document 用此方法可以在c源代码的任意位置用#pragma asm和#pragma endasm嵌入汇编 语句。 但要注意的是在直接使用形参时要小心,在不同的优化级别下产生的汇编代码 有所不同, 可以察看对应的.lst文件看一看,得到正确的优化级别后,#pragma OT (x,speed)锁定 优化级别(这里的值是0-9)。 返回首页
页码,2/2
/wenzhang/keiitled Document
页码,1/2
C51编程:keil c6.20c 直接嵌入汇编的方法!!!
上此站以来,得到大家的很多的帮助,感谢大家!特此奉上"点心"一块供大 家品尝。希望 能增加你营养。 //<asm.h> #ifdef ASM unsigned long shiftR1(register unsigned long); #else extern unsigned long shiftR1(register unsigned long); #endif //end of asm.h //<asm.c> #define ASM #include <asm.h> #include <reg52.h> #pragma OT(4,speed) unsigned long shiftR1(register unsigned long { #pragma asm clr c mov a,r4 rrc a mov r4,a mov a,r5 rrc a mov r5,a mov a,r6 rrc a mov r6,a mov a,r7 rrc a mov r7,a #pragma endasm return(x); } //end of asm.c 将此源文件加入要编译的工程文件, 将光标指向此文件,选择右键菜单“option for file 'asm.c'”, 将属性单“properties”中的“Generate Assembler SRC File”“Assemble SRC File” 两项设置成黑体的“√”将“Link Public Only”的“√”去掉,再编译即 可。 /wenzhang/keil.htm 2004-5-28
keil混合编程

Keil中c语言和汇编语言混合编程1 模块内接口在C51程序内部调用汇编语句的方法是用#pragma语句,具体结构如下:#pragma asm汇编语句行#pragma endasm这种方法实质是通过asm与endasm告诉c51编译器中间行不用编译,是汇编语句行而不是c 语言语句,因而在编译控制指令中有SRC指令以空盒子将这些不用编译的行存入其中。
下面介绍在c51程序内直接嵌入汇编代码的方法:(1)在c文件中将要嵌入的汇编代码按照图1添加到源文件中。
(2)在Project窗口中用鼠标右击包含汇编代码的c文件,在弹出的快捷菜单中选择“Options for test.c”命令,如图2所示。
(3)在弹出的如图3所示的“Options for File test.c”对话框中的properties选项卡中,单击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变为黑色(有效)状态,即使“Generate Assembler SRCFile”和“Assembler SRC File”已经被选中。
(4)根据选择的编译模式,把相应的库文件(如Small模式时,是C51\Lib\C51S.Lib)加入工程中,该文件必须作为工程的最后文件;其他模式应选择相应的库文件,Compact模式对应C51\Lib\C51C.Lib,Large模式对应C51\Lib\C51L.Lib文件。
(5)编译后即可生成目标代码。
在View菜单中执行Periodic Windows Update命令,确保Periodic Windows Update前被选择;在Peripherals菜单中执行I/O port子菜单中的Port1和Port2命令,确保Port1和Port2前被选择,如下图6所示。
(6)使用单步执行,观察运行结果,如图6所示。
可以看出,在并行端口1和端口2,其值是不断变化的。
C51与汇编语言混合编程之一

C51与汇编语言混合编程之一
1、函数内部混合编程若想在C 语言函数内部使用汇编语言,应使用以下Cx51 编译器控制命令:
#pragma asm
;;;Assembly code
#pragma endasm
功能作用:
asm 和endasm 命令用于将其标记的汇编程序合并到.SRC 文件中。
这个带有asm 和endasm 块标记的源程序可看作是在线嵌入式汇编程序。
从这点来说,此命令有些类似于#define 命令。
具体实现:
(1)编译器设置及SRC 文件的产生
.SRC 文件在命令行编译模式下是使用SRC 编译器控制命令产生的,在IDE 环境中可以为需要产生SRC 文件的C 源文件设置特定选项:
l 右键单击Project Workspace 下的文件标签
l 选择Options for file 项,打开Options – Properties 页。
l 选中Generate Assembler SRC file 项
l 选中Assembler SRC file 项
(2)添加库文件
根据选择的编译模式,把相应的库文件添加到工程下面,如在small 模式下,需将keil\c51\lib\c51s.lib 文件加入工程中。
在Keil 安装目录下的\C51\LIB\ 目录的LIB 文件如下:
C51S.LIB - 没有浮点运算的Small modelC51C.LIB - 没有浮点运算的。
10 C语言与汇编语言的混合编程

3.混合项目(续)
模块3(文件名pulse3.asm): PUBLIC _DELAY1MS;用PUBLIC声明_DELAY1MS为其它函数调用,以 “_”为前缀的函数名,表示该函数通过寄存器传递参数 DELAY SEGMENT CODE;定义DELAY段为再定位程序段 ,DELAY是用 户任意起的段名 RSEG DELAY ;选择DELAY为当前段 _DELAY1MS: DELA:MOV R6,#12 ;2T LOP1:MOV R5,#250 ;2T DJNZ R5,$ ;4T DJNZ R6,LOP1 ;4T DJNZ R7,DELA ;R7中数值为C ;程序传递过来的参数,参数为2则延时2ms EXIT: RET END
1.混合编程的实现(续)
第二步:在Keil C51环境下,在Project窗口中包含汇编代码 的C文件上单击右键,在弹出的快捷菜单中选择“Options for…”命令,再点击选中右边的“Generate Assembler SRC File”和“Assembler SRC File”复选框,使检查框由灰色(无 效)变成黑色(有效)状态。
12
3.混合编程
模块1(文件名pulse1.c): #include<STC12C5A.h> #define uchar unsigned char sbit P1_1=P1^1; extern void delay4ms(void); //外部函数delay4ms()声明 void main() { while(1) { P1_1=0; delay4ms (); //调用模块2延时4ms P1_1=1; delay4ms (); //调用模块2延时4ms } }
4
1.混合编程的实现(续)
5
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
KEILC51中C语言加入汇编语言的使用方法
一、为什么使用汇编语言?
汇编语言是一种底层的编程语言,其主要目的是实现对硬件的直接控制,具有高度灵活性和效率。
在开发单片机程序时,通常使用高级语言来编写大部分的代码,但是在一些特定的情况下,使用汇编语言能够更好地满足需求,例如对一些硬件寄存器的操作、实现高速计算等。
二、C语言与汇编语言相结合的方法
在KEILC51中,可以通过使用内联汇编或者使用汇编模块的方式将C 语言与汇编语言相结合。
1.内联汇编
内联汇编是将汇编代码直接嵌入到C语言代码中。
使用内联汇编可以获得更高的性能和灵活性,但也增加了代码的可读性和可维护性。
在C语言中使用内联汇编需要使用__asm关键字,并在括号中编写要嵌入的汇编代码。
以下是一个示例:
```
void delay(unsigned int count)
__asm
MOVR1,
loop:
INCR1
CJNE R1, count, loop
}
```
在上述示例中,使用了__asm关键字将一段简单的汇编代码嵌入到了C函数delay中,以实现一个延时功能。
2.汇编模块
另一种将C语言与汇编语言相结合的方法是使用汇编模块。
汇编模块是一个独立的文件,其中包含了汇编语言代码。
可以通过使用extern关键字将C语言代码与汇编模块连接起来。
首先,需要创建一个汇编模块的文件,例如delay.asm,其中包含了要实现的汇编代码:
```
; delay.asm
PUBLIC delay
delay PROC
MOVR1,
loop:
INCR1
CJNE R1, R2, loop
RET
delay ENDP
```
在上述示例中,创建了一个名为delay的汇编函数,该函数实现了一
个简单的延时功能。
接下来,在C语言代码中使用extern关键字声明要调用的汇编函数:```
// main.c
extern void delay(unsigned int count);
void main
delay(1000);
```
在上述示例中,使用extern关键字声明了一个名为delay的汇编函数。
在main函数中,通过调用delay函数可以实现一个简单的延时。
三、总结
通过在KEILC51中使用C语言与汇编语言相结合的方法,可以使单片
机程序具有更好的性能和灵活性。
使用内联汇编可以将汇编代码直接嵌入
到C语言代码中,而使用汇编模块则可以创建独立的汇编文件并与C语言
代码连接起来。
这些方法可以根据具体的需求选择合适的实现方式。