阅读:3183回复:14
如何在C51中嵌入汇编程序?
请问各位大侠,如何在C51中嵌入汇编语言?
我用了以下方法嵌入,可是行不通,请问还有什么其他方法?谢谢! #asm ......(asm code) #endasm |
|
最新喜欢:![]()
|
沙发#
发布于:2002-05-20 18:13
也有复杂点的方法,是、不容易说明白,你看看这本书吧《单片机高级语言c51应用程序设计》,电子工业出版社,再给你个例子。没有返回值的好做,有返回值的有点复杂,我不太明白。这个例子里面有个smart-ci.asm文件,是可以和c混合使用的汇编,把里面的注释全删了看的清楚
|
|
|
板凳#
发布于:2002-05-21 11:27
请问各位大侠,如何在C51中嵌入汇编语言? 应该是: #pragma . . your asm code . . #endasm |
|
|
地板#
发布于:2002-05-21 12:26
[quote]请问各位大侠,如何在C51中嵌入汇编语言? 应该是: #pragma . . your asm code . . #endasm [/quote] 介绍KEIL C 的格式: 在文件的开头: #pragma SRC 在插入汇编的时候: #pragma asm 你的汇编程序 #pragma endasm 在编译的时候产生。SRC文件。在编译这个文件,就可以生成。OBJ文件。 |
|
地下室#
发布于:2002-05-21 12:29
记得给分哦。
|
|
5楼#
发布于:2002-05-21 15:45
楼上老兄,我很想给你分,可是先请你帮我搞定,谢谢!
我按照你说的方法试过,无奈,编译时出错,具体错误如下: (1)将#pragma SRC 插入文件头,编译出错很多,也看不懂什么错误。 (2)#pragma SRC 不插入文件头,源程序如下: #pragma asm ...... mov dptr,#PORTCCFG (第403行) ...... #pragma endasm 编译错误,错误信息为: *.src(403):error A45:UNDEFINED SYMBOL (PASS-2) 而PORTCCFG明明是一个有效的寄存器,不可能是UNDEFINED SYMBOL ,其他的错误信息和这个相同,也是指明几个有效的寄存器为UNDEFINED SYMBOL,请问这是什么原因? [编辑 - 5/21/02 by liuxf66] |
|
|
6楼#
发布于:2002-05-23 00:00
转载于www.mcu51.com的一遍文章.不过我没有试过是可以.
文章编号:320----加入日期:02-4-22 『关闭窗口』 C51编程:keil c6.20c 直接嵌入汇编的方法!!! (来自C51BBS网友cuiwei) 上此站以来,得到大家的很多的帮助,感谢大家!特此奉上\"点心\"一块供大家品尝。希望 能增加你营养。 //<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 x) { #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”的“√”去掉,再编译即可。 用此方法可以在c源代码的任意位置用#pragma asm和#pragma endasm嵌入汇编语句。 但要注意的是在直接使用形参时要小心,在不同的优化级别下产生的汇编代码有所不同, 可以察看对应的.lst文件看一看,得到正确的优化级别后,#pragma OT(x,speed)锁定 优化级别(这里的值是0-9)。 如有别的问题给我发个邮件。 |
|
|
7楼#
发布于:2002-05-23 01:42
我早就看到这篇帖子了,可是我试过,编译时总是出现许多错误,也不知道是缺头文件还是缺库文件;我也试图给原作者cuiwei去Mail咨询,可是Mail总被退回,不知何故?
还望各位相助!谢谢! |
|
|
8楼#
发布于:2002-05-23 11:22
楼上老兄,我很想给你分,可是先请你帮我搞定,谢谢! 唉! 我不知道你的调试手段:现在给个离子给你: 工具:KEIL V6。20 小程序: #pragma SRC #include \"reg51.h\" void delay(void); main() { delay(); } void delay(void) { #pragma asm nop nop nop nop #pragma endasm } |
|
9楼#
发布于:2002-05-23 11:24
千万别说不行,我刚刚试过。
对了,记得给分。 |
|
10楼#
发布于:2002-05-23 12:17
我用的是Keil C51 6.02版,使用对象是EZUSB AN2131QC,可能和你的不一样,因此还是编译不通过。:(
不过同样谢谢你的热心,3分奉上,权作犒劳。 |
|
|
11楼#
发布于:2002-05-23 15:10
记得嵌入汇编后,生成的文件是SRC类型,在编译的时候要把SRC文件也要和C,ASM文件一起编译。
|
|
12楼#
发布于:2002-05-23 15:11
记得嵌入汇编后,生成的文件是SRC类型,在编译的时候要把SRC文件也要和C,ASM文件一起编译。另外,为什么不用新的版本?
|
|
13楼#
发布于:2002-05-23 16:37
如何在C51中嵌入汇编:
uint youfunc(uint var) { return (var+1); } 用SRC指示C51编译器编译时产生一下汇编语言: ?PR?_YOURFUNC?ASM SEGMENT CODE PUBLIC _YOURFUNC RSEG ?PR?_YOURFUNC?ASM USING 0 _YOURFUNC: MOV A,R7 ADD A,#01H MOV R7,A CLR A ADDC A,R6 MOV R6,A RET //RETURN RESULT IN R6/R7 你可以用#pragma asm和#pragma endasm预处理指示器来在你的C语言程序中插入汇编语言指令。 记的加分噢:) |
|
|
14楼#
发布于:2002-05-23 23:24
刚才我按cuiwei的方法,完全ok!
1:根据cuiwei的文章建立文件asm.h和asm.c 2:将asm.c加入你的工程项目 3:按cuiwei的方法,将asm.c及你需嵌入汇编的c文件的属性中的 “Generate Assembler SRC File”“Assemble SRC File” 勾上,一定要勾成黑色,将它们“Link Public Only”的“√” 去掉有可能全部的C文件都需这样做.不成自己试一下. 4 再编译即可. |
|
|