汇编语言程序设计基本方法
汇编语言程序设计

汇编语⾔程序设计第4章汇编语⾔程序设计§4.1 汇编语⾔的模式⼀、汇编语⾔源程序的⼀般模式[Name 模块名][Title 标题][定义宏][定义数据段][定义附加段][定义堆栈段]定义代码段源程序结束中括号括起的部分可以省略,可见在⼀个汇编语⾔源程序中必须要定义代码段,并且必须有源程序结束指令。
⼆、8086汇编语⾔程序的⼀个例⼦Pg90。
§4.2 语句⾏的构成汇编语⾔中的语句⼀般分为两种类型:指令性语句和指⽰性语句。
指令性语句的格式为:[标号:] 助记符 [操作数1[,操作数2]] [;注释]指⽰性语句的格式为:[名称] 助记符 [参数1,参数2,……] [;注释]标号和名称都是编程⼈员根据需要和⼀定的规则任意取的。
也可以认为汇编语⾔的语句⾏是由标记和分隔符(空格)构成。
⼀、标记1.IBM宏汇编的字符集(1)字母(2)数字符(3)特殊字符2.界符⽤于定界⼀个标记的结束或⼀个标记的开始,本⾝具有⼀定的意义。
3.常量出现在汇编语⾔源程序中的固定值称为常量。
(1)数值常量①⼆进制:以字母B结束。
②⼗进制:以字母D或⽆字母结束。
③⼋进制:以字母Q(或O)结束。
④⼗六进制:以字母H结束。
(2)字符常量指⽤单引号或双引号引起的字符或字符串。
4.标识符由程序员⾃⼰建⽴的字符序列(标号或名称)。
⼀个标识符不能超过31个字符,不能以数字开头。
5.保留字汇编语⾔中具有特殊意义的字符序列。
6.注释⼀⾏中分号以后的部分。
⽤于对⼀段或⼀⾏程序进⾏说明,便于阅读和理解。
⼆、符号具有⼀定意义的字符序列。
1.寄存器名2.变量段属性、偏移属性、类型属性3.标号段属性、偏移属性、类型属性4.常数5.其它三、表达式由操作数和运算符组合⽽成的序列。
1.操作数(1)⽴即数(2)寄存器操作数(3)存储器操作数2.运算符(1)算术运算符+、-、*、/、MOD(求余)(2)逻辑运算符AND、OR、NOT、XOR(3)关系运算符EQ、NE、LT、LE、GT、GE结果为“假”时,返回0,结果为“真”时,返回⼆进制全1。
汇编语言程序设计方法

C 名字前加 下划线
从右到左 调用程序
是
SYSCALL
从右到左 被调用程序
是
STDCALL 名字前加
下划线 (注)
被调用程序
是
PASCAL 名字变大写
BASIC 名字大写
FORTRAN 名字大写
从左到右 被调用程序
是
从左到右 被调用程序
是
从左到右 被调用程序
是
12
PROTO是过程声明伪指令,用于事先声明过程的结构。它的格 式如下:
结束处理部分
AGAIN: ADD AX,CX
;从20,19,……2,1倒序累加到AX
LOOP AGAIN ;每循环一遍,CX自动减1
MOV SUM,AX ;将累加和送入SUM单元
.EXIT 0
END
初始化部分
循环结束? 是 否
工作部分 修改部分 结束处理部分
7
二、用MASM 6.x循环控制伪指令实现循环结构
.CODE
.STARTUP
MOV AL, B
IMUL AL
MOV BX,AX MOV AL,A
;BX中为B的平方
IMUL C
MOV CX,4
IMUL CX
;AX中为4AC
.IF SWORD PTR BX>=AX ;比较B的平方和4AC的大小
MOV SIGN,1
;条件成立,SIGN得到1
.ELSE
MOV SIGN,0
.IF 条件表达式 ;条件为真(非0),执行分支体
分支体
[.ELSEIF 条件表达式
分支体
;前面IF条件为假,并且当前ELSEIF条件为真执行分支体
[.ELSE
;前面IF条件为假执行分支体
汇编语言程序设计.

很多情况下伪指令语句中的名字是变量名,变量名代表存储 器中一个数据区的名字,例如例5.1中的DATA1、DATA2就是变 量名。
第5章 汇编语言程序设计
变量也有三种属性:段、偏移量和类型。 ① 变量的段属性是变量所代表的数据区所在段的段地址。由
于数据区一般在存储器的数据段中,因此变量的段地址常常在 DS和ES寄存器中。
第5章 汇编语言程序设计
1) 名字 汇编语言语句的第一个组成部分是名字(Name)。在指令
语句中,这个名字是一个标号。指令语句中的标号实质上是指 令的符号地址。并非每条指令语句必须有标号,但如果一条指 令前面有一标号,则程序中其它地方就可以引用这个标号。在 例5.1中,START、LOOPER就是标号。标号后面有一个冒号。
3.数据定义伪指令 数据定义伪指令的一般格式为: [变量名] 伪操作符 操作数[,操作数…] ⑴ DB 定义变量的类型为BYTE,给变量分配字节 或字节串操作数。
第5章 汇编语言程序设计
⑵ DW 定义变量的类型为WORD,给变量分配 字操作数。
⑶ DD 定义变量的类型为DWORD,给变量分 配双字操作数。
⒈ 方式伪指令 ⑴ .8086。汇编程序将在8086/8088方式下操作。 ⑵ .386。汇编程序将在80386方式下操作。 2. 符号定义伪指令 ⑴ EQU(赋值伪指令)
汇编语言程序设计的基本方法

01
例2 编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
02
例3 把非压缩十进制数DAT1转换为压缩十进制数
例2编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
通常,编制一个汇编语言源程序应按如下步骤进行:
1
明确任务,确定算法。
2
绘制流程图(包括确定内存单元和分配寄存器)。
3
根据流程图编写汇编语言程序。
4
上机调试程序。
5
程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。
6
5.6 汇编语言程序设计的基本方法
5.6.1 顺序程序设计
顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。 顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。指令指针IP值线形增加,IP=IP+1
条件
N
…
例4用比较指令和条件转移指令实现两路分支的程序段。
两路分支程序设计
例4用比较指令和条件转移指令实现两路分支的程序段。 … MOV AX,M ;假定M和N为有符号数 MOV BX,N CMP AX,BX ;比较 M和N的大小,影响标志位,准备条件 JG NEXT ;M>N时转移,注意若M、N为无符号数时用JA指令 …… ;分支程序2 JMP DONE NEXT: …… ;分支程序1 …… DONE:RET
X+20 (X≥0)
第四章 汇编语言程序设计

一、算术运算符
包括:+,-,*,/(取商),MOD(取余),SHL,SHR 特点:①运算对象及结果均为整数 ②地址只能加减 例: DA1 DA2 MOV MOV MOV MOV DB 1,2,3,4 DB 20 AX,30*5 汇编时 AL,31MOD5 AL,31/5 AL,DA2-DA1
MOV MOV MOV MOV
如:加法:1001、1D、2B……
特点:计算机能够直接识别,执行速度快;
但不方便记忆和编程
2、汇编语言(Assembly Language) 用助记符来表示指令,如:加法:ADD…… 特点:机器不能识别,需翻译;但仍然面向硬件, 执行速度较快;多用于编制系统程序、实时控制和通 信程序。 3、高级语言(High-level Language) 用数学语言和自然语言编程; 如:加法:+,输出:Printf… 特点:编程方便简单,无需了解机器硬件;但机器 不能识别,需要庞大的翻译系统,速度较慢。
类型 返回值 1 2 4 类型 返回值 -1 [FFH] -2 [FEH] DB DW DD
变量
标号
NEAR FAR
数值返回运算符(续)
LENGTH:
•对于一般变量,返回1; •对于DUP定义的变量,返回单元数(直接返回第一
个DUP前的N值); 说明:DUP为复制操作符,格式:N DUP(表达式); N表示复制次数,表达式为复制内容 例:2 DUP(1,2) 等价于 1,2,1,2
则:COUNT的值为5
COUNT表示:DA1,DA2占的字节总数(长度之和) 七、优先级(P136 表4-3)
4.3 伪指令语句
在汇编时进行处理,主要完成变量定义,段定义,
段分配,指示程序开始和结束等功能。
第5章 汇编语言程序

Y
条件满足?
N
处理段
例5-5 设内部RAM30H,31H单元存放两个无符号数, 将大数存在31H,小数存于30H。 ORG 1000H START:CLR C MOV A,30H SUBB A,31H JC NEXT ;次序符合,返回 MOV A,30H ;交换 XCH A,31H MOV 30H,A NEXT: NOP SJMP $ END
$
5-3 分支程序
由条件转移指令构成程序判断框,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构: 例1 求R2中补码绝对值,正数不变, 影响条件 负数变补。
MOV A,R2 JNB ACC.7,NEXT;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT:SJMP NEXT ;结束
五、对源程序进行交叉汇编得到机器代码; 反汇编 —— 分析现成产品的程序,要将二进制 的机器代码语言程序翻译成汇编语言源程序。
六、程序调试。
通过微计算机的串行口(或并行口)把机器代 码传送到用户样机(或在线仿真器)进行程序 的调试和运行。
5.1.3评价程序质量的标准
(1)程序的执行时间。 (2)程序所占用的内存字节数。 (3)程序的逻辑性、可读性。 (4)程序的兼容性、可扩展性。 (5)程序的可靠性。
方法二:采用除10H取余数将BCD拆开 ORG 1000H MOV A,20H; 2B 1T MOV B,#10H ; 3B 2T DIV AB ; 1B 4T ORL B,#30H ; 3B 2T MOV 22H,B ; 3B 2T ORL A,#30H; 2B 1T MOV 21H,A ; 2B 1T SJMP $ END;7条指令、16个内存字节、13个机器周期。
汇编语言程序设计基本方法

相应传送指令:
MOV AX,DATA1
MOV DATA3,BX
01
MOV AL,DATA2[DI]
02
MOV DATA3[SI],DX
03
MOV CX,LENGTH DATA3
04
MOV BX,SIZE DATA3
05
MOV SI,OFFSET DATA2
06
指令中传送的是一个字还是一个字节,通常由操作数的类型确定。
下列指令中,没有确定的类型,是错误的。
MOV DATA3[SI],02H
03
MOV 2[SI],AL
04
MOV 4[DI],02
05
可以采用如下方式纠正:
06
MOV BYTE PTR 4[DI],02
01
02
如果两个操作数的类型不一致,也是错误的:
DATA1 DW 05H
DATA2 DB 0FH,10H,0AH
01
01
02
03
04
05
MOV AX, ES:[SI]
对BP寄存器
MOV AL, DATA2[BP];对应DS段
MOV AL, 10[BP]; 对应SS段
02
03
04
05
3.2.1 数据传送类指令
取有效地址指令(LEA) 将源操作数SRC的有效地址(偏移地址)送入寄存器REG中 比较: MOV AX,10H[DI] LEA AX,10H[DI] (DI)=0500H,(DS)=0200H
4.2 8086/8088指令系统
单/击/此/处/添/加/副/标/题/内/容
指令类型:
送指令
算指令
算指令
令
理指令和CPU控制指令
汇编语言程序设计

22
9 8 5 4 2
8 9 5 4 2
8 5 9 4 2
8 5 4 9 2
8 5 4 2 9
8 5 4 2
5 8 4 2
5 4 8 2
5 4 2 8
5 4 4 4 5 2 2 2 5
4 2 2 4
23
9 8 2 4 5
8 9 2 4 5
8 2 9 4 5
8 2 4 9 5
8 2 4 5 9
8 2 4 5
2 8 4 5
1+[1+(1+1+2)*24+2]*10+2 = 993 ( )
19
[例4-7]把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起 7]把内部RAM中起始地址为 中起始地址为BLK1的数据块传送到外部RAM以BLK2为 的数据块传送到外部 始地址的区域,直到遇到“ 字符的ASCⅡ码为止。去掉块长度。 始地址的区域,直到遇到“#”字符的ASCⅡ码为止。去掉块长度。 参考程序如下: 参考程序如下: ORG 2000H BLK1 EQU 30H ;起始地址 BLK2 EQU 1000H ;起始地址 MOV SP, #6FH MOV R0,#BLK1 R0, BLK1数据块起始地址 ;BLK1数据块起始地址 MOV DPTR,#BLK2 ;BLK2数据块起始地址 DPTR, BLK2数据块起始地址 XH: CLR C XH: MOV A,@R0 ;取数据 PUSH ACC SUBB A,#23H 判是否为“ 字符, ;判是否为“#”字符,条件 JZ STOP POP ACC MOVX @DPTR ,A ;数据传送 INC R0 INC DPTR AJMP XH ;循环控制 STOP: STOP: SJMP $ END
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章汇编语言程序设计基本方法1.教学目的:掌握微型汇编语言程序分析和设计方法
2.教学要求:
①熟悉汇编语言程序设计的基本步骤。
②掌握程序流程图的使用,会利用其分析问题。
③掌握汇编语言的顺序、分支、循环程序的设计。
④了解实模式下80386及其后继机型的汇编语言的程序设计3.教学重点:
①利用流程图分析问题。
②顺序、分支、循环程序的设计。
4.掌握难点:
①分支程序设计
②循环程序设计
5.教学进程安排:P137~P168
6.教学方法:
课堂讲授
7.教学内容摘要:
7.1 汇编语言程序设计概述
7.1.1 汇编语言程序设计的基本步骤
1.分析问题,抽象出描述问题的数学模型
2.确定算法
3.绘制流程图
4.分配存储空间和工作单元
5.编写程序
6.静态检查
7.上机调试运行
7.1.2 程序流程图
1. 用自然语言表示算法
2. 流程图的组成
⑴执行框(矩形框)
⑵判别框(菱形框)
⑶开始框和终止框
⑷指向线
⑸连接点
3. 三种基本结构和改进的流程图
⑴传统流程图的弊端
⑵三种基本结构
①顺序结构
②选择结构
③循环结构
图7.4 顺序结构图图7.5 选择结构图
4. 结构化程序设计的特点
⑴只有一个入口
⑵只有一个出口
⑶各功能框均可执行
⑷结构中无死循环
7.2 顺序程序设计
顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条条执行。
【例7-3】将—个字节压缩BCD码转换为两个ASCII码。
7.3 分支程序设计
7.3.1 分支程序的结构形式
分支程序结构可以有两种形式,如图7.6
(1) IF_THEN_ELSE结构 (2) CASE结构
7.3.2 分支程序设计方法
程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令使程序产生了多个不同的分支,而对于数组中的每一个数,它只能是多个分支中的某一个。
【例7-5】在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI 寄存器中,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。
【例7-6】折半查找算法程序
7.3.3 跳跃表法
分支程序的两种结构形式都可以用上面所述的方法来实现。
此外,在实现CASE结构时,还可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去,
【例7-7】试根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支中去。
7.4 循环程序设计
7.4.1 循环程序结构
循环程序结构可以总结为两种结构形式,如图7.8所示。
1. DO_WHILE结构
2. DO_UNTIL结构
⑴ DO WHILE结构⑵ DO UNTIL结构
图7.8 循环程序的结构形式
构成循环程序的三部分:
1.设置循环的初始状态
2.循环体
3.循环控制部分
7.4.2 循环程序设计方法
【例7-9】试编制一个程序把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。
【例7-11】在附加段中,有一个首地址为LIST和未经排序的字数组。
在数组的第一个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数。
要求编制一程序:在数组中查找该数,如果找到此数,则把它从数组中删除。
7.4.3 多重循环程序设计
循环可以有多重结构。
多重循环程序设计的基本方法和单重循环程序设计是一致的,应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。
另外,应该注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。
下面举例加以说明。
【例7-15】有一个首地址为A的N字数组,编制程序使该数组中的数按照从大到小的次序排序,采用起泡排序算法完成。
7.4.4 串操作程序
【例7-16】位串插入程序。
程序要求把一个小于32位的位串插入存储器内的一个大位串中
的任意位置中去。
欲插入的位串存放在BITSG中,它是一个右对齐的位串,可称其为子串,其长度用BITSG_LENGTH为符号名的=伪操作来说明。
大位串存放在STRING中,并为要插入的子串准备了一个符号名为SG_END的双字单元。
7.5 在实模式下发挥80386及其后继机型的优势
7.5.1 充分利用高档机的32位字长特性
80X86系列从80386起就把机器字长从16位增加到32位。
字长的增加除有利于提高运算精度外,也能提高编程效率。
【例7-17】如有两个4字长(64位)数分别存放在DATA1和DATA2中,请用8086指令编写一程序求出它们的和,并把结果存放于DATA3中。
7.5.2 通用寄存器可作为指针寄存器
前面的讨论已经说明386及其后继机型除提供16位寻址外,还提供了32位寻址。
在实模式下,这两种寻址方式可同时使用。
并且列出了16位寻址和32位寻址所允许使用的寄存器情况。
可以看出,在使用32位寻址时,32位通用寄存器可以作为基址或变址寄存器使用。
也就是说,允许32位通用寄存器作指针寄存器用。
在实模式下,段的大小被限制于64KB,这样段内的偏移地址范围应为0000~FFFFH,所以在把32位通用寄存器用作指针寄存器时,应该注意它们的高16位应为0。
应注意,32位通用寄存器可用作指针寄存器,但“16位通用寄存器中仍然只有BX,BP和SI,DI可用作指针寄存器。
所以,下列指令是合法的:
MOV EAX,[BX]
MOV EAX,[EDX]
MOV AX,WORD PTR [ECX]
而下列指令是非法的:
MOV AX,[DX]
MOV EAX,[CX]
在386及其后继机型中,允许同一寄存器既用于基址寄存器,也用于变址寄存器。
因此,下列指令也是合法的:
MOV AX,[EBX][EBX]
7.7.3 与比例因子有关的寻址方式
80386及其后继机型所提供的与比例因子有关的三种寻址方式:
1.比例变址寻址方式
2.基址比例变址寻址方式
3.相对基址比例变址寻址方式。
这些寻址方式为表格处理和多维数组处理提供了有力的工具。
【例7-19】用比例变址寻址方式编写一程序,要求把5个双字相加并保存其结果。
8.总结:
①理解程序的三大结构
②掌握三大结构的实现方法。