发个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中
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
zqy517
1楼-- · 2020-01-28 08:17
早看过,但是就是没有试过!谢谢分享!
zhangzheyuanxp
2楼-- · 2020-01-28 13:19
1121mark
idly
3楼-- · 2020-01-28 17:42
good
sangreal
4楼-- · 2020-01-28 23:13
顶,谢谢分享
ln08136207
5楼-- · 2020-01-29 03:21
 精彩回答 2  元偷偷看……
ln08136207
6楼-- · 2020-01-29 05:33
我用F330做东西,再没进行嵌套汇编的设置之前,程序运行正确,比如捕获脉宽:
         输入脉宽值              脉宽变量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
此外,我的所有变量,似乎都只有高位,没有低位了。

一周热门 更多>