① 51单片机,怎么样使得C语言与汇编语言结合起来我想在C语言里调用汇编语言函数。
首先写个H文件,把汇编的函数申明在里面
例如:
extern bit plus(iu8 *d_dat,iu8 *s_dat,u8 len);
然后,建立ASM文件,例如tool.asm
先指定存储区
?PR?_plus?TOOL SEGMENT CODE
?PR?固定的,然后是函数名前+下划线,?TOOL 是这个asm的名字,CODE是存储区
然后向外申明函数
PUBLIC _plus
最后是函数体
RSEG ?PR?_plus?TOOL
_plus:
USING 0
。。。。
ret
参数传递,R7是第一个参数,R6是第二个。。。,如果不是char ,或参数是指针,那么占用多个Rn,
例如:
这个函数中,d_dat是R7,R6;s_dat是R5,R4;len是R3
② 关于51点单片机中汇编语言如何调用C的子程序
不太好办,先用C51编写出程序主体,在程序中加入#pragma src(*.a51)控制命令,或在工程项目窗口中设置“Generate Assembleer SRC File”和“Assemble SRC File”选项,编译模块文件,得到相应的a51文件,按要求改写汇编代码
③ 51单片机中汇编语言如何调用C的子程序
我的程序是KEIL编译的,如下
先申明
EXTRN CODE (_Send_CRC) ;Send_CRC是C中的函数,汇编中加了_
调用的时候
LCALL _Send_CRC
如果要使回用C中的变答量,那么CODE变成相应的DATA,XDATA等
编译和链接的时候使用的指令:(AMD处理器,64位操作系统)
编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
汇编语言用nasm编写并用nasm编译器编译,而C语言用的是gcc编译,这些都没有问题,但是在链接的时候出错了,提示如下:
ld: i386 architecture of input file `foo.o' is incompatible with i386:x86-64 output
google了一下,意思就是nasm 编译产生的是32位的目标代码,gcc 在64位平台上默认产生的是64位的目标代码,这两者在链接的时候出错,gcc在64位平台上默认以64位的方式链接。
这样在解决的时候就会有两种解决方案:
<1> 让gcc 产生32位的代码,并在链接的时候以32位的方式进行链接
在这种情况下只需要修改编译和链接指令即可,具体如下:
32位的编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具体的-m32 和 -m elf_i386 请自行查阅gcc (man gcc)
如果你是高版本的gcc(可能是由于更新内核造成的),可能简单的使用-m32 的时候会提示以下错误(使用别人的历程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
这应该是缺少构建32 位可执行程序缺少的包,使用以下指令安装:
sudo apt-get install libc6-dev-i386
此时应该就没有什么问题了。
⑤ 怎样在单片机C代码中加入汇编延时子程序
(1)、C51语言中调用汇编语言程序;
C51语言调用汇编语言程序要注意以下几点:
1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入工程中。
3:在C51语言中必须声明需要调用的函数为外部函数。extern void DELAY(void);
4:在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是可从新定位的。
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
实例如下:
C51语言文件:
#include "reg51.h"
extern void DELAY(void);
extern void DEL(void);
void main(void)
{
P1=0x00;
DELAY();
DEL();
P1=0xff;
}
汇编语言文件:
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
DELAY: MOV R2,#3H
DJNZ R2,$
RET
DEL: MOV R3,#03H
DJNZ R3,$
RET
END
(2)、C51语言中嵌入汇编程序;
在C51语言中嵌套使用汇编语言编写程序要注意以下的几个问题:
1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入工程中。
3:用#pragma asm,和#pragma endasm语句包含嵌入的汇编语言程序。
实例如下:
#include "reg51.h"
void delay(void);
void main(void)
{
void delay(void);
P1=0x00;
#pragma asm
MOV R3,#08H
DJNZ R3,$
#pragma endasm
P1=0xff;
}
void delay(void)
{
#pragma asm
MOV R4,#08H
DJNZ R4,$
#pragma endasm
}