发个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中
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
输入脉宽值 脉宽变量width值
3000us 0x0bc3
2200us 0x08a3
3800us 0x0ee5
在做如下设置:
1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma ASM;
Assembler Code Here
#pragma ENDASM
2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和
“Assemble SRC File”,使检查框由灰 {MOD}变成黑 {MOD}(有效)状态;
3、根据选择的编译模式,把 KeilC51LibC51S.Lib)加入工程中, 该文件作为工程的最后文件;
为了方便测试,排除错误,我把嵌套汇编的程序屏蔽掉了,但是测试下来得到如下的值
输入脉宽值 脉宽变量width值
3000us 0x0b
2200us 0x08
3800us 0x0e
此外,我的所有变量,似乎都只有高位,没有低位了。
一周热门 更多>