函数内部混合编程
若想在C语言函数内部使用汇编语言,应使用以下Cx51编译器控制命令:
#pragma asm
;;; Assembly code
#pragma endasm
功能作用:
asm和endasm命令用于将其标记的汇编程序合并到.SRC文件中。这个带有asm和endasm块标记的源程序可看作是在线嵌入式汇编程序。从这点来说,此命令有些类似于#define命令。
具体实现:
(1)编译器设置及SRC文件的产生
.SRC文件在命令行编译模式下是使用SRC编译器控制命令产生的,在IDE环境中可以为需要产生SRC文件的C源文件设置特定选项:
右键单击Project Workspace下的文件标签
选择Options for file…项,打开Options – Properties页。
选中Generate Assembler SRC file项
选中Assembler SRC file项
(2)添加库文件
根据选择的编译模式,把相应的库文件添加到工程下面,如在”small”模式下,需将”keil/c51/lib/c51s.lib”文件加入工程中。在Keil安装目录下的/C51/LIB/目录的LIB文件如下:
C51S.LIB- 没有浮点运算的Small model
C51C.LIB- 没有浮点运算的Compact model
C51L.LIB- 没有浮点运算的Large model
C51FPS.LIB- 带浮点运算的Small model
C51FPC.LIB- 带浮点运算的Compact model
C51FPL.LIB- 带浮点运算的Large model
若未添加此库文件,则会提示”UNRESOLVED EXTERNAL SYMBOL”警告。
如上设置后,编译,IDE会生成汇编源文件(.SRC)并由汇编器将此文件转化成目标文件(.OBJ)。
注意事项:
此时在汇编语言中虽可以加标签,以执行一些跳转类指令,但要注意不要与编译器产生的其他标签相同。
在遵循了Cx51参数的调用规则后,如在向该函数传递一char数时,编译器会将其编译成通过R7传递,此时在汇编语言若直接调用R7,会出现定义的变量(形参)未调用警告。
函数外部混合编程
具体实现:
若要将一完整的函数编写为汇编语言,并可被其它函数调用,此时可以遵循如下过程