第四章 汇編语言程序设讣
第四章 汇编语言程序设计
4.1汇编语言程序设计概述 所谓程序设计,就是按照给定的任务要求,编写 出完整的计算机程序。要完成同样的任务,使用的方 法或程序并不是唯一的。因此,程序设计的质量将直 接影响到计算机系统的工作效率、运行可靠性。 前面我们学过了汇编语言形式的指令系统,本章 重点介绍汇编语言程序结构以及如何利用汇编语言指 令进行程序设计的方法
所谓程序设计,就是按照给定的任务要求,编写 出完整的计算机程序。要完成同样的任务,使用的方 法或程序并不是唯一的。因此,程序设计的质量将直 接影响到计算机系统的工作效率、运行可靠性。 前面我们学过了汇编语言形式的指令系统,本章 重点介绍汇编语言程序结构以及如何利用汇编语言指 令进行程序设计的方法。 4.1 汇编语言程序设计概述
4.1.1汇编语言程序设计步骤 使用汇编语言设计一个程序大致上可分为以下几个步骤。 (1)分析题意,明确要求。 (2)确定算法。 (3)画程序流程图,用图解来描述和说明解题步骤。 起止框 处理框 半断框 流程线 连接点 图4.1常用的流程图符号 (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