发个keil C调用汇编模块的例子

2020-01-27 11:43发布

发个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中
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。