第四章汇编语言程序设计
第一节汇编语言源程序的格式和伪指令
(一)学习要求
1、掌握汇编语言源程序格式和伪指令。 2、掌握各种伪指令功能。
(二)内容提要
一:汇编语言源程序的格式 1、语句格式
汇编语言源程序是由汇编语句(即指令)组成的。汇编语言一般由四部分组成。其典型的汇编语句格式如下:
标号: 操作码 操作数 ;注释 START: MOV A,30H ;A←(30H)
(1) 标号段 标号是用户定义的符号地址。
(2) 操作码段 操作码段是每一语句中不可缺少的部分,也是语句的核心部分,用于指示计算机进行何种操作,汇编程序就是根据这一字段生成目标代码的。
(3) 操作数段 指出了参与操作的数据或存放该数据的地址。通常有目的操作数和源操作数之分。
(4) 注释段 为了增强程序的可读性,可在某行指令的后面用分号起头,加上注释,用以说明该条指令或该段程序的功能、作用,以供编程人员参考。此注释内容程序汇编时CPU不予处理,不产生目标代码。 二:伪指令
1、定位伪指令ORG(Origin)
格式: [标号:] ORG m m:16位二进制数,代表地址。
功能:指出汇编语言程序通过编译,得到的机器语言程序的起始地址。
2、定义字节伪指令DB(Define Byte)
格式:[标号:] DB X1,X2,~Xn
Xn:单字节二进制、十进制、十六进制数,或以? ?括起来的字符串,数据符号。
功能:定义程序存储器从标号开始的连续单元,用来存放常数、字符和表格。 3、定义字伪指令DW(Define Word)
格式:[标号:] DW Y1,Y2,~Yn Yn:双字节二进制、十进制、十六进制数,或以? ?括起来的字符串,数据符号。
功能:同DB,不同的是为16位数据。 4、汇编结束命令END 格式:[标号:] END
功能:END是汇编语言源程序的汇编结束标志,在它后面所写的指令均不予处理。 5、等值命令EQU
格式:字符名称 EQU 数或汇编符号
功能:将一个数或特定的汇编符号赋予规定的字符名称。先定义后使用。 6、数据地址赋值命令DATA 格式:字符名称 DATA 表达式
功能:将数据地址或代码地址赋予规定的字符名称
1
(三)习题与思考题
1、汇编语言源程序的格式及含义是什么?
2、什么叫伪指令?伪指令与指令有什么区别?
第二节汇编语言源程序汇编
(一)学习要求
(1) 掌握汇编程序的过程。
(2) 了解机器汇编与人工汇编的区别。
(二)内容提要
用汇编语言编写的源程序称为汇编语言源程序。汇编通常由专门的汇编程序来进行,通过编译后自动得到对应于汇编源程序的机器语言目标程序,这个过程叫机器汇编。另外还可用人工汇编。
一、汇编程序的汇编过程
汇编过程是将汇编语言源程序翻译成目标程序的过程。汇编程序是两次扫描。第一次扫描是进行语法检查并建立该源程序使用的全部符号名字表。在这个表中,每个符号名字后面跟着一个对应的值。第一次扫描中如有错误则显示出错信息,扫描完,显示出错数目,然后返回编辑状态。这时可对源程序进行修改。如没有错误可进行第二次扫描,最后生成目标程序的机器码并得到对应于符号地址(即标号地址)的实际地址值。第二次扫描还产生相应的列表文件,此文件中有与每条源程序相对应的机器码、地址和编辑行号以及标号地址的实际地址等,可作为程序调试时使用。
二、人工汇编
由程序员根据MCS-51的指令集将汇编语言源程序的指令逐条人工翻译成机器码的过程叫人工汇编。人工汇编同样采用两次汇编方法。第一次汇编,首先查出各条指令的机器码,并根据初始地址和各条指令所占的字节数,确定每条指令所在的地址单元。第二次汇编,求出标号地址所代表的实际地址及相对应地址偏移量的具体补码值。
例:对下列程序进行人工汇编 ORG 1000H START:MOV R7,#200 DLY1:NOP NOP
NOP
DJNZ R7,DLY1
RET
第一次汇编查指令集,确定每条指令的机器码和字节数。通过ORG伪指令可依次确定各指令的首址。结果如下:
地址 指令码 ORG 1000H
1000H 7F C8 START:MOV R7,#200 1002H 00 DLY1:NOP 1003H 00 NOP
1004H 00 NOP
1005H DF 地址偏移量rel DJNZ R7,DLY1
1007H 22 RET 第二次汇编计算出转移指令中的地址偏移量rel。
当DJNZ R7,DLY1指令中的条件成立时,程序将发生转移,从执行这条指令后的当
2
前地址转移到DLY1标号地址上。因此,地址偏移量rel =1002H-1007H = -05H,补码表示的偏移量为0FBH。将计算结果填入第一次汇编时待定的偏移量值处。 人工汇编很麻烦而且容易出错,一般不采用。
(三)习题与思考题
1、机器汇编程序两次扫描的过程及作用是什么? 2、人工汇编与机器汇编的的区别是什么?
第三节汇编语言的程序举例
(一)学习要求
(1) 掌握顺序、循环、子程序、分支程序。 (2) 掌握延时程序的设计方法。
(二)内容提要
1、程序设计的基本步骤 一般步骤为:
(1)分析题意,明确要求; (2)建立思路,确定算法;
(3)编制框图,绘出流程; (4)编写程序,上机调试;
显然,算法和流程是至关重要的。程序结构有简单顺序、分支、循环和子程序等几
种基本形式。 2、画流程图
画流程图是指用各种图形、符号、指向线等来说明程序 设计的过程。国际通用的图形和符号说明如下:
椭圆框:起止框,在程序的开始和结束时使用。 矩形框:处理框,表示要进行的各种操作。
菱形框:判断框,表示条件判断,以决定程序的流向。 指向线:流程线,表示程序执行的流向。
圆 圈:连接符,表示不同页之间的流程连接。 各种几何图形符号如下图所示。 一、简单程序的设计
例4-1 已知两个压缩BCD码分别放在内部RAM的31H30H和33H 32H等4个单元中,试编程求和,结果存入R4R3R2中。 分析:流程如图: 程序如下:
ORG 0000H LJMP MAIN
ORG 0040H MAIN: MOV A, 30H ADD A, 32H
DA MOV A
R2,A
MOV A,31H ADDC A,33H DA
A
3
MOV R3,A A
ACC.0,C R4, A HERE
CLR MOV MOV HERE: SJMP
END
例4-2 利用查表指令将内部RAM中20H单元的压缩BCD码拆开,转换成相应的ASCII码,存入21H、22H中,高位存在22H。 分析:控制流程图(略),程序如下:
START:MOV DPTR,#TABLE
MOV ANL
A, 20H A, #0FH
MOVC A, @A+DPTR MOV 21H, A MOV ANL
A, 20H A, #0F0H
SWAP A
MOVC A, @A+DPTR MOV 22H, A
DB
35H,36H,37H,38H,39H
SJMP $
TABLE: DB 30H,31H,32H,33H,34H
二、分支程序设计 1、单分支程序 单分支结构程序使用转移指令实现,即根据条件对程序的执行进行判断,满足条件是转移执行,否则顺序执行。
在MCS-51指令系统中条件转移指令有: (1)判A转移指令JZ、JNZ;
(2)判位转移指令JB、JNB、JBC、JC、JNC; (3)比较转移指令CJNE;
(4)减1不为0转移指令DJNZ;
例4-3 假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1、ST2单元中分别存放着两个8位无符号数,要求找出其中的大数并存入ST3单元。
分析:两个无符号数的大小比较可利用两数相减是否有借位来判断,流程图和程序如下所示:
START:CLRC
MOV
DPTR,#ST1
A, @DPTR
MOVX
MOV INC MOVX SUBB
R7, A DPTR
A, @DPTR A, R7 BIG1
A, @DPTR BIG2
4
JC MOVX SJMP