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

- 没有浮点运算的

Compact modelC51L.LIB - 没有浮点运算的 Large modelC51FPS.LIB - 带浮 点运算的

Small modelC51FPC.LIB

-

带浮点运算的

Compact

modelC51FPL.LIB - 带浮点运算的 Large model

若未添加此库文件,则会提示 UNRESOLVED EXTERNAL SYMBOL 警告。

如上设置后,编译,IDE 会生成汇编源文件(.SRC)并由汇编器将此文件转化 成目标文件(.OBJ)。 注意事项:

(1) 此时在汇编语言中虽可以加标签,以执行一些跳转类指令,但要注意 不要与编译器产生的其他标签相同。

(2) 在遵循了 Cx51 参数的调用规则后,如在向该函数传递一 char 数时, 编译器会将其编译成通过 R7 传递,此时在汇编语言若直接调用 R7,会出现定 义的变量(形参)未调用警告。 2、函数外部混合编程 具体实现:

若要将一完整的函数编写为汇编语言,并可被其它函数调用,此时可以遵循 如下过程:

(1) 源文件的建立

新建一 C 源文件如 test.c,将其加入工程中,并写出要实现函数的的哑函数 (即写出函数名及形参,不用给出具体实现,但最好写出简单调用形参的代码, 使编译器不提示 定义的变量未被调用的警告)。 (2) 从上具体过程之(1)。 (3) 从上具体过程之(2)。

(4) 编译文件,将 test.c 从工程中移除,将生成的 test.src 文件改名,如 test.a51。

(5) 将 test.a51 加入工程, 并在其内部书写具体要实现的汇编代码。 (6) 重新编译整体文件即可。 注意事项:

(1) 调用前一定要在所调用的文件内部声明该函数的存在,写法应同汇编 语言的 C 函数实现一样,即 test.c 中的函数名称。 tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4