6 MCS-51程序设计

学习笔记
作者: MingXiao

6.1 概述

编译流程图

伪指令

ORG 0000H			;Origin
END					;程序结束
KC EQU 30H			;赋值伪指令,KC=30H
DB	'A', 34H
DW	'AB', 1234H
ABC BIT P1.1		;位地址赋值,将P1.1赋给ABC这个变量

伪指令在编译时起作用

6.2 汇编语言编程

汇编器(MASM)在编译时执行

  1. 将汇编指令翻译为机器码
  2. 确定每条指令的大小,形成相对地址
  3. 给出语法错误
  4. 形成.obj文件

查表,求平方

ORG 0000H
LJMP START
ORG 1000H
START: 	MOV DPTR, #table
		MOV A, 20H
		MOVC A, @A+DPTR		;由于table在Code内,故适用MOVC
		MOV 21H, A
		SJMP $				;原地跳转
ORG 2000H
table: db 0, 1, 4, 9, 16, 25
END

将30H内的变量分类放回

ORG 0000H
LJMP START
ORG 1000H
START:	MOV A, 30H
		JZ ZERO
		ANL	A, #80H			;保留符号位,A<0,那么结果不为0
		JNZ MINUS
		LJMP DAYU0
ZERO:	MOV 30H, #20H
		LJMP OVER
MINUS:	MOV A, 30H
		ADD A, #5H
		MOV 30H, A
		LJMP OVER
DAYU0:	MOV 30H, A
OVER:	SJMP $
END

50ms延迟程序,12MHz时钟,机器周期为1us

DEL:	MOV R7, #200		;1机器周期(MC)
DEL1:	MOV R6, #123		;1MC
		NOP					;1MC
		DJNZ R6, $			;2MC * 123
		DJNZ R7, DEL1		;2MC
		RET

延时\(1+200\times[(1+1+2\times123)+2]+2\approx 50\)ms

将RAM中起始地址为data的数据段发送到外部起始地址为buffer的存储区域,数据段以'$'结尾

		MOV R0, #data
		MOV DPTR, #buffer
LOOP1:	MOV A, @R0
		CJNE A, #24H, LOOP2		;24H是'$'的ASCII码
		SJMP LOOP3
LOOP2:	MOVX @DPTR, A
		INC R0
		INC DPTR
		SJMP Loop1
LOOP3:	END

6.3 C/ASM混合编程

函数命名规则

在KEIL C51中,编译器对C语言程序中的函数名会自动转换

void fun1(void) 转为 fun1,即无参数/寄存器传递的函数

void fun2(int) 转为 _fun2,即有参数传递的函数

参数传递规则

混合编程

  • 在一个group内需要声明多个文件类型,不能重名;编译完有多个.obj文件需要link

  • 在C中编写主函数

    #include<reg51.h>
    
    extern int sqr(int a, int b);        #外部的函数需要用extern声明
    
    int main()
    {
        int a = 1;
        int b = 2;
        return sqr(a, b);
    }
    
  • 在a51中编写子函数

    ?PR?FUNCTION SEGMENT CODE        ;在ROM中定义段,其中?PR?是段定义指令,FUNCTION是自定义段名
    
    RSEG ?PR?FUNCTION
    
    public _sqr                        ;可以被其他模块调用
    


Comments