发个keil C调用汇编模块的例子
琢磨了一下午,网上找的C调用汇编模块感觉看不太明白,索性就写个简单的
//第一个文件是C的内容
#include <reg51.h>
extern void DELAY(unsigned int delaytime);//对汇编函数的声明
void main(void)
{
while(1)
{
P0=0x00;
DELAY(0xFF);//在这里调用了汇编
P0=0xFF;
DELAY(0xFF);
}
}
//第二个文件是汇编的内容
?PR?_DELAY SEGMENT CODE
PUBLIC _DELAY
RSEG ?PR?_DELAY
_DELAY: //注意这里有个“_”下划线是不可缺的
USING 0
?C0001:
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0004
DEC R6
?C0004:
ORL A,R4
JNZ ?C0001
?C0003:
RET
END
这两个添加都keil工程里面就可以了,可简单了,希望新手少走点弯路
其它的知识:
函数名的转换规律
主函数中的声明 汇编符号名 说明
Viod func(void) FUNC 无参数传递或不含寄存器的函数名不作转变转入目标文件中,名字只是简单地转为大写形式
Void func(char) _FUNC 带寄存器参数的函数名,前面加“_”前缀,它表明这类函数包含寄存器内的参数传递
Void func(void) reentrant _?FUNC 对于重入函数,前面加“_?”前缀,它表明该函数包含栈内才参数传递
命名转换规律
存储区 命名转换
CODE ?PR?CO
XDATA ?XD
DATA ?DT
BIT ?BI
PDATA ?PD
接收参数寄存器
参数序号 Char Int Long,float 通用指针
1 R7 R6&R7 R4~R7 R1~R3
2 R5 R4&R5 - -
3 R3 R2&R3 - -
返回值类型与寄存器对照
返回值类型 寄存器 说明
Bit C(标志位) 由具体标志位返回
Char/unsigned char 1byte指针 R7 单字节由R7返回
int/unsigned int 2byte指针 R6&R7 双字节由R6和R7返回,高位在R6中,低位在R7中
Long、unsigned long R4~R7 高位在R4中,低位在R7中
Float R4~R7 32bit IEEE格式,指数和符号位在R7中
通用指针 R1~R3 存储类型在R3中,高位在R2中,低位在R1中
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>