第四章 汇編语言程序设讣
第四章 汇编语言程序设计
4.1汇编语言程序设计概述 所谓程序设计,就是按照给定的任务要求,编写 出完整的计算机程序。要完成同样的任务,使用的方 法或程序并不是唯一的。因此,程序设计的质量将直 接影响到计算机系统的工作效率、运行可靠性。 前面我们学过了汇编语言形式的指令系统,本章 重点介绍汇编语言程序结构以及如何利用汇编语言指 令进行程序设计的方法
所谓程序设计,就是按照给定的任务要求,编写 出完整的计算机程序。要完成同样的任务,使用的方 法或程序并不是唯一的。因此,程序设计的质量将直 接影响到计算机系统的工作效率、运行可靠性。 前面我们学过了汇编语言形式的指令系统,本章 重点介绍汇编语言程序结构以及如何利用汇编语言指 令进行程序设计的方法。 4.1 汇编语言程序设计概述
4.1.1汇编语言程序设计步骤 使用汇编语言设计一个程序大致上可分为以下几个步骤。 1)分析题意,明确要求。 (2)确定算法 (3)画程序流程图,用图解来描述和说明解题步骤。 起止框 处理框 ¥判断所框 流程线 连接点 (4)分配内存工作单元,确定程序与数据区的存放地址。 (5)编写源程序 (6)程序优化 (⑦)上机调试、修改和最后确定源程序
4.1.1 汇编语言程序设计步骤 使用汇编语言设计一个程序大致上可分为以下几个步骤。 (1) 分析题意,明确要求。 (2) 确定算法。 (3) 画程序流程图,用图解来描述和说明解题步骤。 图4.1 常用的流程图符号 (4) 分配内存工作单元,确定程序与数据区的存放地址。 (5) 编写源程序 (6) 程序优化。 (7)上机调试、修改和最后确定源程序
422伪指令语句 伪指令并不是真正的指令,也不产生相应的机器 码,它们只是在计算机将汇编语言转换为机器码时, 指导汇编过程,告诉汇编程序如何汇编。下面介绍 些MCS-51汇编程序常用的伪指令 (1)汇编起始伪指令ORG 格式:[标号:]ORG16位地址 功能:规定程序块或数据块存放的起始地址。如 oRG 8000H START: MOVA,#30H 该指令规定第一条指令从地址8000H单元开始存放, 即标号 START的值为8000H
4.2.2 伪指令语句 伪指令并不是真正的指令,也不产生相应的机器 码,它们只是在计算机将汇编语言转换为机器码时, 指导汇编过程,告诉汇编程序如何汇编。下面介绍一 些MCS-51汇编程序常用的伪指令。 (1)汇编起始伪指令ORG 格式:[标号:] ORG 16位地址 功能:规定程序块或数据块存放的起始地址。如: ORG 8000H START: MOV A ,#30H …… 该指令规定第一条指令从地址8000H单元开始存放, 即标号START的值为8000H
2)汇编结束伪指令END 格式:[标号:]END[表达式 功能:结束汇编。 例如: ORG 2000H START: MOV A,#OOH END START 表示标号 START开始的程序段结束。 (3)等值指令EQU 格式:字符名称EQU项 例如, TEST EQU R0 MOv A, TEST
(2)汇编结束伪指令END 格式:[标号:] END [表达式] 功能:结束汇编。 例如: ORG 2000H START: MOV A ,# 00H …… END START 表示标号START开始的程序段结束。 (3)等值指令EQU 格式:字符名称 EQU 项 例如,TEST EQU R0 MOV A,TEST
(4)定义字节指令DB 格式:[标号:]DB8位二进制数表 DB命令是从指定的地址单元开始,定义若干个8 位内存单元的内容。例如 ORG 1000H TAB;DB23H,73,“6 B TABI: DB 110B 以上伪指令经汇编以后,将对从1000H开始的若干 内存单元赋值: (1000H)=23H(1001H)49H (1002H)=36H(1003H)=42H 1004H=06H 其中36H和42H分别是字符6和B的ASC码,其余 的十进制数(73)和二进制数(110B)也都换算为十 六进制数了
(4)定义字节指令DB 格式:[标号:] DB 8位二进制数表 DB命令是从指定的地址单元开始,定义若干个8 位内存单元的内容。例如, ORG 1000H TAB; DB 23H,73, “6” , “B” TABl: DB 110B 以上伪指令经汇编以后,将对从1000H开始的若干 内存单元赋值: (1000H)=23H (1001H)=49H (1002H)=36H (1003H)=42H (1004H)=06H 其中36H和42H分别是字符6和B的ASCII码,其余 的十进制数(73)和二进制数(110B)也都换算为十 六进制数了
(5)定义字命令DW 格式:[标号:]DW16位二进制数表 例如, ORG 1000H TAB: DW 1234H, 0ABH, 10 汇编后: (1000H)=12H(1001H)=34H (1002H)=00H(1003H)=ABH 1004H)=00H(1005H=0AH DB、DW伪指令都只对程序存储器起作用,不能 用来对数据存储器的内容进行赋值或进行其它初始化 的工作
(5)定义字命令 DW 格式:[标号:] DW 16位二进制数表 例如, ORG 1000H TAB: DW 1234H , 0ABH , 10 汇编后: (1000H)=12H (1001H ) = 34H (1002H ) = 00H ( 1003H ) = ABH (1004H ) =00H (1005H) =0AH DB、DW伪指令都只对程序存储器起作用,不能 用来对数据存储器的内容进行赋值或进行其它初始化 的工作
4.2顺序程序设计 顺序结构程序是一种最简单、最基本的程序(也称为简单 程序),它是一种无分支的直线形程序,按照程序编写的顺序 依次执行 【例4-1】两个8位无符号数相加,和仍为8位。 假设两个无符号数X1,X2分别存放于内部RAM6OH 61H单元中,求其和并将和送入62H单元。 程序如下: ORG 0000H CLR MOV R0,#60H :设R0为数据指针 MOV a, ORO :取Ⅹ INC RO ADDC A, aRO :X,+Ⅹ INC RO MOV aRO, A 保存结果 END
4.2 顺序程序设计 顺序结构程序是一种最简单、最基本的程序(也称为简单 程序),它是一种无分支的直线形程序,按照程序编写的顺序 依次执行。 【例4-1】 两个8位无符号数相加,和仍为8位。 假设两个无符号数X1, X2分别存放于内部RAM60H、 61H单元中,求其和并将和送入62H单元。 程序如下: ORG 0000H CLR C MOV R0 ,# 60H ;设R0为数据指针 MOV A ,@R0 ;取X1 1NC R0 ADDC A ,@R0 ;X1+X2 1NC R0 MOV @R0,A ;保存结果 END
【例4-2】两个无符号双字节数相加。设被加数存放在内部存 储器30H(高位字节)、31H(低位字节)单元,加数存放在内 部存储器40H(高位字节)、41H(低位字节)单元,和存入30H (高位字节)、31H(低位字节)单元 程序如下: ORG 0000H CLR :将C清零 MOV R0,#31H :送被加数首址 MOV R1,#41H 送加数首址 MOV A,⑦aRQ 取被加数低宰节 ADD A ORI 两个低宰节相加 MOV ORO. A 低宰节和荐人被加数低宰节 DEC RO 修改指针,指向被加数高宰节 DEC RI 修改指针,指向加数高宰节 MOV A. ORO 取被加数高字节 ADDC A. ORI 高宰节相加 MOV ORO. A 存结果 已ND
【例4-2】两个无符号双字节数相加。设被加数存放在内部存 储器30H(高位字节)、31H(低位字节)单元,加数存放在内 部存储器40H(高位字节)、41H(低位字节)单元,和存入30H (高位字节)、31H(低位字节)单元。 程序如下: ORG 0000H CLR C ;将C清零 MOV R0 ,#31H ;送被加数首址 MOV R1 ,#41H ;送加数首址 MOV A ,@R0 ;取被加数低字节 ADD A ,@R1 ;两个低字节相加 MOV @R0 ,A ;低字节和存人被加数低字节 DEC R0 ;修改指针,指向被加数高字节 DEC R1 ;修改指针,指向加数高字节 MOV A,@R0 ;取被加数高字节 ADDC A,@R1 ;高字节相加 MOV @R0 , A ;存结果 END
【例4-3】编写16位二进制数求补程序 进制数的求补可归结为“求反加1”的过程,求反可用 CPL指令实现;加1时应注意,加1只能加在低8位的最低位上 因为现在是16位数,有两个字节,因此要考虑进位问题,即低8 位取反加1,高8位取反后应加上低8位加1时可能产生的进位, 还要注意这里的加1不能用ⅠNC指令,因为NC指令不影响CY标 ORG 0200H MOV A, RO ;低8位送A CPL A ;取反 ADD A, #OlH ;加1 MOV R2,A ;存结果 MOV A, RI ;高8位送A CPL A ;取反 ADDC A, #OOH ;加进位 MOV R3, A ;存结果 END
【例4-3】编写16位二进制数求补程序 二进制数的求补可归结为“求反加1”的过程,求反可用 CPL指令实现;加1时应注意,加1只能加在低8位的最低位上。 因为现在是16位数,有两个字节,因此要考虑进位问题,即低8 位取反加1,高8位取反后应加上低8位加1时可能产生的进位, 还要注意这里的加1不能用INC指令,因为INC指令不影响CY标 志。 ORG程序如下: 0200H MOV A ,R0 ;低8位送A CPL A ;取反 ADD A ,#01H ;加l MOV R2 ,A ;存结果 MOV A ,R1 ;高8位送A CPL A ;取反 ADDC A ,#00H ;加进位 MOV R3 ,A ;存结果 END