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

mac2025-10-14  6

;防止重复包含头文件 $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)