liuxf66
驱动中牛
驱动中牛
  • 注册日期2001-08-15
  • 最后登录2003-04-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3182回复:14

如何在C51中嵌入汇编程序?

楼主#
更多 发布于:2002-05-20 17:12
请问各位大侠,如何在C51中嵌入汇编语言?
我用了以下方法嵌入,可是行不通,请问还有什么其他方法?谢谢!
#asm
......(asm code)
#endasm

最新喜欢:

cpboycpboy
liuxf66
dinolos
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2004-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-20 18:13
也有复杂点的方法,是、不容易说明白,你看看这本书吧《单片机高级语言c51应用程序设计》,电子工业出版社,再给你个例子。没有返回值的好做,有返回值的有点复杂,我不太明白。这个例子里面有个smart-ci.asm文件,是可以和c混合使用的汇编,把里面的注释全删了看的清楚
附件名称/大小 下载次数 最后更新
2002-05-20_FIRMWAR.ZIP (27KB)  18
菜鸟不怕大虾! 菜鸟也要做大虾!
liumda
驱动小牛
驱动小牛
  • 注册日期2002-01-23
  • 最后登录2012-07-16
  • 粉丝0
  • 关注0
  • 积分76分
  • 威望48点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-21 11:27
请问各位大侠,如何在C51中嵌入汇编语言?
我用了以下方法嵌入,可是行不通,请问还有什么其他方法?谢谢!
#asm
......(asm code)
#endasm


应该是:
#pragma
.
.
your asm code
.
.
#endasm
You Happy,So I Happy!
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-21 12:26
[quote]请问各位大侠,如何在C51中嵌入汇编语言?
我用了以下方法嵌入,可是行不通,请问还有什么其他方法?谢谢!
#asm
......(asm code)
#endasm


应该是:
#pragma
.
.
your asm code
.
.
#endasm [/quote]

介绍KEIL C 的格式:
在文件的开头:
#pragma SRC

在插入汇编的时候:
#pragma asm
  你的汇编程序
#pragma endasm

在编译的时候产生。SRC文件。在编译这个文件,就可以生成。OBJ文件。
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-21 12:29
记得给分哦。
liuxf66
驱动中牛
驱动中牛
  • 注册日期2001-08-15
  • 最后登录2003-04-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
liuxf66
ysfc51
驱动牛犊
驱动牛犊
  • 注册日期2001-10-01
  • 最后登录2009-12-27
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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)。

如有别的问题给我发个邮件。

 
千山千幅画 一步一重天
liuxf66
驱动中牛
驱动中牛
  • 注册日期2001-08-15
  • 最后登录2003-04-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-23 01:42
我早就看到这篇帖子了,可是我试过,编译时总是出现许多错误,也不知道是缺头文件还是缺库文件;我也试图给原作者cuiwei去Mail咨询,可是Mail总被退回,不知何故?
还望各位相助!谢谢!
liuxf66
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-23 11:22
楼上老兄,我很想给你分,可是先请你帮我搞定,谢谢!
我按照你说的方法试过,无奈,编译时出错,具体错误如下:
(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]


唉!
我不知道你的调试手段:现在给个离子给你:
 工具:KEIL V6。20
 小程序:
  #pragma SRC
#include \"reg51.h\"

void delay(void);

main()
{
delay();

}
 
void delay(void)
{
#pragma asm
   nop
   nop
   nop
   nop
#pragma endasm
}
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-23 11:24
千万别说不行,我刚刚试过。
对了,记得给分。
liuxf66
驱动中牛
驱动中牛
  • 注册日期2001-08-15
  • 最后登录2003-04-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-23 12:17
我用的是Keil C51 6.02版,使用对象是EZUSB AN2131QC,可能和你的不一样,因此还是编译不通过。:(
不过同样谢谢你的热心,3分奉上,权作犒劳。
liuxf66
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-05-23 15:10
记得嵌入汇编后,生成的文件是SRC类型,在编译的时候要把SRC文件也要和C,ASM文件一起编译。
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-05-23 15:11
记得嵌入汇编后,生成的文件是SRC类型,在编译的时候要把SRC文件也要和C,ASM文件一起编译。另外,为什么不用新的版本?
liumda
驱动小牛
驱动小牛
  • 注册日期2002-01-23
  • 最后登录2012-07-16
  • 粉丝0
  • 关注0
  • 积分76分
  • 威望48点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
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语言程序中插入汇编语言指令。

记的加分噢:)
You Happy,So I Happy!
ysfc51
驱动牛犊
驱动牛犊
  • 注册日期2001-10-01
  • 最后登录2009-12-27
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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 再编译即可.
千山千幅画 一步一重天
游客

返回顶部