如何在keil中联合编译C与汇编

;防止重复包含头文件
$NOMOD51
;定义该文件的名称
NAME    MAIN
;定义端口地址名称
P0    DATA    080H
P1    DATA    090H
P2    DATA    0A0H
P3    DATA    0B0H
T0    BIT    0B0H.4
AC    BIT    0D0H.6
T1    BIT    0B0H.5
T2    BIT    090H.0
EA    BIT    0A8H.7
IE    DATA    0A8H
EXF2    BIT    0C8H.6
RD    BIT    0B0H.7
ES    BIT    0A8H.4
IP    DATA    0B8H
RI    BIT    098H.0
INT0    BIT    0B0H.2
CY    BIT    0D0H.7
TI    BIT    098H.1
INT1    BIT    0B0H.3
RCAP2H    DATA    0CBH
PS    BIT    0B8H.4
SP    DATA    081H
T2EX    BIT    090H.1
OV    BIT    0D0H.2
RCAP2L    DATA    0CAH
C_T2    BIT    0C8H.1
WR    BIT    0B0H.6
RCLK    BIT    0C8H.5
TCLK    BIT    0C8H.4
SBUF    DATA    099H
PCON    DATA    087H
SCON    DATA    098H
TMOD    DATA    089H
TCON    DATA    088H
IE0    BIT    088H.1
IE1    BIT    088H.3
B    DATA    0F0H
CP_RL2    BIT    0C8H.0
ACC    DATA    0E0H
ET0    BIT    0A8H.1
ET1    BIT    0A8H.3
TF0    BIT    088H.5
ET2    BIT    0A8H.5
TF1    BIT    088H.7
TF2    BIT    0C8H.7
RB8    BIT    098H.2
TH0    DATA    08CH
EX0    BIT    0A8H.0
IT0    BIT    088H.0
TH1    DATA    08DH
TB8    BIT    098H.3
EX1    BIT    0A8H.2
IT1    BIT    088H.2
TH2    DATA    0CDH
P    BIT    0D0H.0
SM0    BIT    098H.7
TL0    DATA    08AH
SM1    BIT    098H.6
TL1    DATA    08BH
SM2    BIT    098H.5
TL2    DATA    0CCH
PT0    BIT    0B8H.1
PT1    BIT    0B8H.3
RS0    BIT    0D0H.3
PT2    BIT    0B8H.5
TR0    BIT    088H.4
RS1    BIT    0D0H.4
TR1    BIT    088H.6
TR2    BIT    0C8H.2
PX0    BIT    0B8H.0
PX1    BIT    0B8H.2
DPH    DATA    083H
DPL    DATA    082H
EXEN2    BIT    0C8H.3
REN    BIT    098H.4
T2CON    DATA    0C8H
RXD    BIT    0B0H.0
TXD    BIT    0B0H.1
F0    BIT    0D0H.5
PSW    DATA    0D0H
;声明数据段与代码段
?PR?_add?MAIN        SEGMENT CODE 
?PR?main?MAIN        SEGMENT CODE 
?DT?main?MAIN        SEGMENT DATA OVERLAYABLE 
;声明要调用的外部函数
    EXTRN    CODE (DELAY100)
    EXTRN    CODE (_DELAY)
    EXTRN    CODE (?C?LLDPTR)
    EXTRN    CODE (?C_STARTUP)
;main与_add(下划线代表该函数有参数),可以给外部文件调用
    PUBLIC    main
    PUBLIC    _add
;申明数据段
    RSEG  ?DT?main?MAIN
?main?BYTE:
         MM?141:   DS   4;定义MM为long型变量
    ORG  4
         nn?142:   DS   4;定义nn为long型变量
;;;;;;;;;;;;;;;;;;;;;;add函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    RSEG  ?PR?_add?MAIN
_add:
    USING    0;使用第0组寄存器
    LJMP     ?C?LLDPTR;跳转去执行相应的操作并返回

;;;;;;;;;;;;;;;;;;;;;;主函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    RSEG  ?PR?main?MAIN
main:
    USING    0
    ;第一个参数存入内存;
    MOV      MM?141+03H,#040H;1000,000的16进制为0xf4240,先把0x40存入MM?141+03H这个地址
    MOV      MM?141+02H,#042H;在把0x42存入MM?141+03H这个地址
    MOV      MM?141+01H,#0FH;在把0xF存入MM?141+03H这个地址
    MOV      MM?141,#00H
    ;传入该参数的地址
    MOV      R3,#00H
    MOV      R2,#HIGH (MM?141)
    MOV      R1,#LOW (MM?141)
    ;调用add函数,把得到的返回值存入R6,R7
    LCALL    _add
    ;给nn赋值
    MOV      A,R6
    RLC      A
    SUBB     A,ACC
    MOV      nn?142+03H,R7
    MOV      nn?142+02H,R6
    MOV      nn?142+01H,A
    MOV      nn?142,A
    ;调用延迟100的函数,该函数无参数
    LCALL    DELAY100
    ;调用延迟函数,该函数有参数,把参数事先写入R5,R4,R7
    MOV      R5,#0E8H
    MOV      R4,#03H
    MOV      R7,#0AH
    ;调用延迟函数
    LCALL    _DELAY
    ;死循环
?C0002:
    SJMP     ?C0002
    END

对应的主函数

/*********步骤********
*在keil的安装目录下加入C51S.LIB文件,告诉编译器是小端模式
*右键main.c,打开选项一栏,选中Generate Assembler SRC File和Assemble src File
*整体链接后的文件可以在main.src中查看
*********************/


#include <reg52.h>
extern DELAY100();
extern void DELAY(unsigned char i,unsigned int j);
long add(long *a)
{
    return (*a);
}
void main()
{
    long MM = 1000000,nn;
    nn = add(&MM);
    DELAY100();
    DELAY(10,1000);
    while(1);
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值