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)在编译时执行
- 将汇编指令翻译为机器码
- 确定每条指令的大小,形成相对地址
- 给出语法错误
- 形成
.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 ;可以被其他模块调用