1
本章主要教学内容
指令格式及寻址的有关概念
8086CPU指令系统的寻址方式及其应用
8086CPU各类指令的表示,功能,特点及其应用
Pentium微处理器新增指令和寻址方式介绍
汇编语言的基本表达方式和内容
汇编语言程序设计的基本步骤和基本方法
顺序,分支,循环,子程序基本结构和设计方法
常用的 DOS和 BIOS中断调用简介第 3章指令系统与汇编语言程序设计
2
本章教学目的及要求通过学习,使学生掌握指令的寻址方式,
指令系统及其应用;学会程序设计的基本方法;掌握程序设计的技巧,保证程序设计的质量 。
第 3章指令系统与汇编语言程序设计
3
第 3章
3.1 指令格式及寻址
1,指令系统与指令格式在计算机中要执行的各种操作命令称为指令 。 计算机所能执行的全部命令的集合即为该计算机的指令系统 。
计算机指令以二进制编码的形式存放在存储器中,用二进制编码形式表示的指令称为机器指令,CPU可以直接识别机器指令 。 人们采用一些助记符 —— 通常是指令功能的英文单词的缩写,如数据传送指令用助记符 MOV( MOVE的缩写 ),这样表示的指令称为符号指令,也称为汇编指令 。 汇编指令具有直观,
易理解,好记忆的特点 。
指令系统与汇编语言程序设计
4
第 3章指令系统与汇编语言程序设计计算机中的汇编指令由操作码字段和操作数字段两部分组成 。
( 1) 操作码字段:操作码表示计算机要执行的某种指令功能,由它来规定指令的操作类型,说明计算机要执行的具体操作,例如传送,运算,移位,跳转等操作 。 同时还指出操作数的类型,操作数的传送方向,寄存器编码或符号扩展等,
是指令中必不可少的组成部分 。
( 2) 操作数字段:操作数表示计算机在操作中所需要的数据,或者所需数据的存放位置 ( 也称为地址码 ),还可以是指向操作数的地址指针或其它有关操作数据的信息 。
5
8086的指令格式如图 3-1所示,指令的长度范围是 1~ 6个字节。其中,操作码字段为 1~ 2个字节( B1,B2),操作数字段为 0~ 4个字节( B3~ B6)。每条具体指令的长度将根据指令的操作功能和操作数的形式而定。
图 3-1 8086的指令格式
OP code low disp或 data high disp 或 data low data high data
B 1 B 2 B 3 B 4 B 5 B 6
OP code
第 3章指令系统与汇编语言程序设计
6
第 3章指令系统与汇编语言程序设计
2,寻址及寻址方式的概念计算机的指令中通常要指定操作数的位置,即给出操作数的地址信息,在执行时需要根据这个地址信息找到需要的操作数,这种寻找操作数的过程称为寻址 。 寻址方式就是寻找操作数或操作数地址的方式 。
不同机器的指令系统都规定了一些寻址方式以供编程时选择使用,根据给定的寻址方式,就可以方便地访问各类操作数 。
7
第 3章指令系统与汇编语言程序设计
8086指令中的操作数有三种可能的存放位置:
( 1) 操作数直接在指令中,即跟随在指令操作码之后,指令的操作数部分就是操作数本身,这种操作数叫立即操作数 。
( 2) 操作数存放在 CPU的某个内部寄存器中,这时指令的操作数部分是 CPU内部寄存器的一个编码,称为寄存器操作数 。
( 3) 操作数存放在内存储器的数据区中,这时指令的操作数部分包含此操作数所在的内存地址,称为存储器操作数 。
8
第 3章指令系统与汇编语言程序设计
3.2 8086 CPU的寻址方式
3.2.1 立即数寻址立即数寻址方式是指操作数直接存放在给定的指令中,紧跟在操作码之后 。
立即数可以是 8位或 16位二进制数 。 例如,给定如下指令,
采用立即数寻址:
MOV AL,10 ; 十进制数 ( D )
MOV AL,00100101B ; 二进制数 ( B )
MOV AX,263AH ; 十六进制数 ( H )
9
第 3章指令系统与汇编语言程序设计
3.2.2 寄存器寻址寄存器寻址方式是在指令中直接给出寄存器名,寄存器中的内容即为所需操作数 。 在寄存器寻址方式下,操作数存在于指令规定的 8位,16位寄存器中 。 寄存器可用来存放源操作数,也可用来存放目的操作数 。
寄存器寻址方式是 CPU内部的操作,不需要访问总线周期,
因此指令的执行速度比较快 。
对于 16位操作数,寄存器可以是 AX,BX,CX,DX,SI、
DI,SP,BP等 。
对于 8位操作数,寄存器可以是 AH,AL,BH,BL,CH,CL、
DH,DL等 。
10
第 3章指令系统与汇编语言程序设计
3.2.3 存储器寻址计算机中访问内存的寻址方式有多种,不管哪一种寻址方式,最终都将得到存放操作数的物理地址 。
采用存储器寻址时,指令中需要给出操作数的地址信息 。
存储器操作数的有效地址 EA的计算方法和寻址方式有着密切地联系,而操作数物理地址 PA的计算则和操作数的具体存放位置有关 。
11
第 3章指令系统与汇编语言程序设计
1.
直接寻址方式是一种针对内存的寻址方式 。 在这种寻址方式下,指令中给出的地址码即为操作数的有效地址 EA,它是一个 8位或 16位的位移量 。 在默认方式下,操作数存放在数据段 DS中,如果要对除 DS段之外的其他段如 CS,ES,SS中的数据寻址,应在指令中增加前缀,指出段寄存器名,这称为段跨越 。
在直接寻址方式的指令中,操作数的有效地址 EA已经给出,那么操作数的物理地址为,PA= ( DS) × 10H+ EA。
12
第 3章指令系统与汇编语言程序设计
2,寄存器间接寻址方式寄存器间接寻址方式是指操作数的有效地址 EA在指定的寄存器中,这种寻址方式是在指令中给出寄存器,寄存器中的内容为操作数的有效地址 。
16位操作数寻址时,EA放在基址寄存器 BX,BP或变址寄存器 SI,DI中,所以该方式下操作数的物理地址计算公式有以下几个:
物理地址 PA= ( DS) × 10H+ ( BX)
物理地址 PA= ( DS) × 10H+ ( DI)
物理地址 PA= ( DS) × 10H+ ( SI)
物理地址 PA= ( SS) × 10H+ ( BP)
13
第 3章指令系统与汇编语言程序设计
3,寄存器相对寻址方式这种寻址方式是在指令中给定一个基址寄存器或变址寄存器和一个 8位或 16位的相对偏移量,两者之和作为操作数的有效地址 。 当选择间址寄存器 BX,SI,DI时,指示的是数据段中的数据,选择 BP作间址寄存器时,指示的是堆栈段中的数据 。
有效地址计算为,EA= ( reg) + 8位或 16位偏移量;其中 reg为给定寄存器 。
物理地址计算为:
PA= ( DS) × 10H+ EA ( 使用 BX,SI,DI间址寄存器 )
PA= ( SS) × 10H+ EA ( 使用 BP作为间址寄存器 )
14
第 3章指令系统与汇编语言程序设计
4,基址变址寻址方式在基址变址寻址方式中,有效地址 EA是基址寄存器加变址寄存器,即两个寄存器的内容之和为操作数的有效地址 。
在该寻址方式中,当基址寄存器和变址寄存器的默认段寄存器不同时,一般由基址寄存器来决定默认用哪一个段寄存器作为段基址指针 。 若在指令中规定了段跨越,则可以用其他寄存器作为段基地址 。
基址变址寻址方式的物理地址计算公式为:
物理地址 PA= ( DS) × 10H+ ( BX) + ( SI)
物理地址 PA= ( SS) × 10H+ ( BP) + ( DI)
15
第 3章指令系统与汇编语言程序设计
5,相对基址变址寻址方式这种寻址方式是在指令中给出一个基址寄存器,一个变址寄存器和 8位或 16位的偏移量,三者之和作为操作数的有效地址 。
基址寄存器可取 BX或 BP,变址寄存器可取 SI或 DI。
如果基址寄存器采用 BX,则段寄存器使用 DS;
如果基址寄存器采用 BP,则段寄存器使用 SS。
其物理地址计算为:
PA= ( DS) × 10H+ ( BX) + ( SI) 或 ( DI) +偏移量
PA= ( SS) × 10H+ ( BP) + ( SI) 或 ( DI) +偏移量
16
第 3章指令系统与汇编语言程序设计
3.2.4 I/O端口寻址由于 8086CPU的 I/O端口采用独立编址方式,可有 64K个字节端口或 32K个字端口 。 指令系统中设有专门的输入指令 IN和输出指令 OUT来进行访问,I/O
端口的寻址方式有直接端口寻址和寄存器间接端口寻址两种 。
17
第 3章指令系统与汇编语言程序设计
1,直接端口寻址直接端口寻址是在指令中直接给出要访问的端口地址,一般采用 2位十六进制数表示,可访问的端口数为 0~ 255个 。
例如,IN例如,IN AL,30H ;表示从 I/O端口地址为 30H的端口中取出字节数据送到 8位寄存器 AL中 。
IN AX,50H ;表示从 I/O端口地址为 50H和
51H的两个相邻端口中取出字数据送到 16位寄存器 AX
中 。
18
第 3章指令系统与汇编语言程序设计
2,寄存器间接端口寻址当访问的端口地址数 ≥256时,直接端口寻址不能满足要求,要采用 I/O端口的间接寻址方式 。 它是把
I/O端口的地址先送到寄存器 DX中,用 16位的 DX作为间接寻址寄存器 。 此种方式可访问的端口数为 0~
65535个 。
例如,MOV DX,283H ;将端口地址 283H送到 DX寄存器 。
OUT DX,AL ;将 AL中的内容输出到 DX
所指定的端口中 。
19
第 3章指令系统与汇编语言程序设计
3.3 8086 CPU的指令系统
8086指令系统是 80X86/Pentium微处理器的基本指令集 。 指令的操作数可以是 8位或 16位,偏移地址是 16位 。 按功能可将指令分成六大类,即:数据传送类指令,算术运算类指令,逻辑运算与移位类指令,串操作类指令,控制转移类指令和处理器控制类指令 。
20
第 3章指令系统与汇编语言程序设计
3.3.1 数据传送类指令数据传送类指令的基本功能是把操作数或操作数的地址传送到指定的寄存器或存储单元中 。 数据传送类指令共有 14条,
根据传送的内容可分成以下 4组:
( 1) 通用数据传送指令;
( 2) 累加器专用传送指令;
( 3) 地址传送指令;
( 4) 标志寄存器传送指令 。
21
第 3章指令系统与汇编语言程序设计
1,通用数据传送指令
( 1) 传送指令 MOV
格式,MOV dst,src
MOV 指令的功能是 把源操作数 src传送至目的操作数
dst,执行后 源操作数内容不变,目的操作数内容与源操作数内容相同 。
源操作数可以是通用寄存器,段寄存器,存储器以及立即数,目标操作数可以是通用寄存器,段寄存器 ( CS除外 ) 或存储器 。
22
通用寄存器
( AX,BX,CX,DX,
SI,DI,BP,SP )
存储器立即数段寄存器
( CS,DS,SS,ES )
数据之间的传送关系如图 3-5所示。
图 3-5 数据之间的传送关系
23
第 3章指令系统与汇编语言程序设计使用 MOV指令进行数据传送时要注意以下几点:
( 1) 段寄存器 CS及立即数不能作为目标操作数;
( 2) 两个存储单元之间不允许直接传送数据;
( 3)立即数不能直接传送到段寄存器;
( 4)两个段寄存器之间不能直接传送数据;
( 5) 传送数据的类型必须匹配;
( 6) MOV指令不影响标志 位。
24
第 3章指令系统与汇编语言程序设计
( 2) 堆栈操作指令 PUSH/POP
进栈指令,PUSH opr ; SP← SP- 2,将源操作数 opr压入堆栈出栈指令,POP opr ;栈顶弹出字数据到目标操作数 opr,SP← SP+2
堆栈是存储器中的一个特殊区域,主要用于存入和取出数据,堆栈是以,先进后出,的方式进行数据操作的 。 在 8086的堆栈组织中,堆栈从高地址向低地址方向生长,它只有一个出入口,堆栈指针寄存器 SP始终指向堆栈的栈顶单元
25
第 3章指令系统与汇编语言程序设计
( 3) XCHG 交换指令
XCHG指令用来将源操作数和目的操作数的内容进行交换 。 它可以实现字节数据交换,也可以实现字数据交换 。
该指令的操作数必须有一个是在寄存器中,即可以在两个通用寄存器之间或寄存器与存储器之间交换数据,但不能在两个存储器之间交换数据 。 指令执行结果不影响标志位 。
26
第 3章指令系统与汇编语言程序设计
2,累加器专用传送指令
8086指令系统中将累加器 AX作为数据传输的核心,系统的输入 /输出指令 IN/OUT和换码指令 XLAT就是专门通过累加器来执行的,称之为累加器专用传送指令 。
27
第 3章指令系统与汇编语言程序设计
3,地址传送指令
8086的地址传送指令用于控制寻址机构,它可将存储器操作数的地址传送到 16位目标寄存器中 。 这类指令有以下 3
种形式:
( 1) 有效地址送寄存器指令,LEA reg,src
LEA指令功能是将存储器操作数 src的有效地址传送到 16位的通用寄存器 reg。
( 2) 地址指针送寄存器和 DS指令,LDS reg,src
该指令完成一个 32位的地址指针传送,地址指针包括段地址和偏移地址两部分 。
( 3) 地址指针送寄存器和 ES指令,LES reg,src
LES指令执行的操作与 LDS指令相似,不同之处是以 ES代替 DS。
28
第 3章指令系统与汇编语言程序设计
4,标志寄存器传送指令
8086可通过这类指令读出当前标志寄存器中各标志位的内容,也可以重新设置各标志位的值 。 标志寄存器的传送指令共有 4条,均位单字节指令,指令的操作数以隐含形式出现,隐含为 AH寄存器 。
( 1) 取标志指令 LAHF
( 2) 置标志位指令 SAHF
( 3) 标志寄存器入栈指令 PUSHF
( 4) 标志寄存器出栈指令 POPF
29
第 3章指令系统与汇编语言程序设计
3.3.2 算术运算类指令
8086的算术运算类指令包括加,减,乘,除 4种基本运算指令,以及为进行 BCD码十进制数运算而设置的各种较正指令 。
8086的基本算术运算指令中,除加 1和减 1指令外,
其余均为双操作数指令,两个操作数中除了源操作数可为立即数外,必须有一个操作数在寄存器中,
而单操作数指令则不允许采用立即数方式 。
30
第 3章指令系统与汇编语言程序设计加减法运算在执行过程中会产生溢出,无符号数运算时,如果加法运算最高位向前产生进位或减法运算最高位向前有借位,则表示出现溢出,采用标志位 CF=1来表示;带符号数采用补码运算时,符号位也参与运算,出现溢出则表示运算结果发生了错误,采用标志位 OF=1来表示 。
31
第 3章指令系统与汇编语言程序设计算术运算指令除加 1指令 INC不影响 CF标志外,其余指令对 CF,OF,ZF,SF,PF,AF等 6个标志位均可产生影响,其规则如下:
无符号数运算产生溢出时,CF= 1;
带符号数运算产生溢出时,OF= 1;
当运算结果为 0时,ZF= 1;
当运算结果为负数时,SF= 1;
当运算结果中有偶数个 1时,PF= 1;
当操作数为 BCD码,低 4位出现进位 1时,AF= 1。
32
第 3章指令系统与汇编语言程序设计
1,加法指令
( 1) 不带进位加法指令,ADD dst,src
指令功能为,( dst) ← ( dst) +( src)
( 2) 带进位的加法指令,ADC dst,src
指令功能为,( dst) ← ( dst) +( src) +CF
( 3) 加 1指令,INC opr
指令功能为,( opr) ← ( opr) +1
33
第 3章指令系统与汇编语言程序设计
2,减法指令
( 1) 不带借位减法指令,SUB dst,src
指令功能为,( dst) ← ( dst) - ( src)
( 2) 带借位的减法指令,SBB dst,src
指令功能为,( dst) ← ( dst) - ( src) - CF
( 3) 减 1指令,DEC opr
指令功能为,( opr) ← ( opr) - 1
( 4) 求补指令,NEG opr
该指令将 opr中的内容取 2的补码,相当于将 opr中的内容按位取反后末位加 1。
( 5) 比较指令,CMP opr1,opr2
指令功能为,( opr1) - ( opr2)
34
第 3章指令系统与汇编语言程序设计
3,乘法运算指令乘法指令包括无符号数和带符号数相乘的指令,
指令中只给出乘数,被乘数隐含给出 。 两个 8位数相乘时被乘数放入 AL中,16位数的乘积存放到 AX中;
两个 16位数相乘时被乘数先放入 AX寄存器中,32位数的乘积放到 DX和 AX两个寄存器中,规定 DX中存放高 16位,AX中存放低 16位 。
35
第 3章指令系统与汇编语言程序设计
( 1) 无符号数乘法指令,MUL src
若 src为字节数据,执行 AX← ( AL) × ( src) ;
若 src为字数据,执行 DX,AX← ( AX) × ( src)
( 2) 带符号数乘法指令,IMUL src
该指令的执行功能与 MUL相同 。
36
第 3章指令系统与汇编语言程序设计
4,除法运算指令除法指令可用来实现两个无符号数或带符号数的除法运算,包括字和字节两种操作,该指令隐含使用 AX和 DX作为一个操作数,指令中给出的源操作数为除数 。
( 1) 无符号数除法指令,DIV src
DIV指令的被除数,除数,商和余数全部为无符号数 。
( 2) 带符号数除法指令,IDIV src
IDIV指令的被除数,除数,商和余数均为带符号数,且余数的符号位同被除数 。
两条指令执行的操作功能如下:
当除数 src为字节数据时,用 AX除以 src,得到的 8位商保存在 AL中,8
位余数保存在 AH中;
当除数 src为字数据时,用 DX,AX除以 src,得到的 16位商保存在 AX中,
16位余数保存在 DX中 。
37
第 3章指令系统与汇编语言程序设计
5,符号扩展指令符号扩展指令是指用一个操作数的符号位形成另一个操作数,后一个操作数的各位是全 0( 正数 ) 或全 1( 负数 ),符号扩展指令虽然使数据位数加长,但数据的大小并没有改变 。
该指令的执行不影响标志位 。
( 1) 字节转换为字指令 CBW
该指令的功能是将 AL中的符号位 D7扩展到 AH中 。
( 2) 字转换为双字指令 CWD
该指令的功能是将 AX中的符号位扩展到 DX中 。
38
第 3章指令系统与汇编语言程序设计
6,十进制调整指令十进制数在计算机中是采用二进制数来表示的,
这就是 BCD码,要对十进制的 BCD码进行算术运算,
必须对得到的结果进行调整,否则结果无意义 。
8086指令系统提供了以下两类十进制调整指令 。
( 1) 组合 BCD码加法,减法调整指令
DAA ;组合 BCD码加法调整指令,将 AL中的和调整为组合 BCD码
DAS ;组合 BCD码减法调整指令,将 AL中的差调整为组合 BCD码
39
第 3章指令系统与汇编语言程序设计
( 2) 非组合 BCD加法,减法调整指令
AAA ;非组合 BCD加法调整指令,将 AL中的和调整为非组合
BCD码
AAS ;非组合 BCD减法调整指令,将 AL中的差调整为非组合
BCD码
AAA和 AAS分别用于加法指令 ( ADD,ADC) 或减法指令
( SUB,SBB) 之后,执行时对 AL进行测试,若 AL中的低四位
> 09H,或 AF= 1,则进行 AL← ( AL) ± 06H修正; AL的高 4位为 0,同时 AH← ( AH) ± 1; CF= AF= 1。 调整后的结果放在
AX中
40
第 3章指令系统与汇编语言程序设计
3.3.3 逻辑运算与移位类指令
1,逻辑运算指令有以下 5条逻辑运算指令,它们可对 8位或 16位操作数按位进行逻辑运算 。
( 1) 逻辑与指令,AND dst,src
( 2) 逻辑或指令,OR dst,src
( 3) 逻辑异或指令,XOR dst,src
( 4) 逻辑非指令,NOT dst
( 5) 测试指令,TEST dst,src
。
41
第 3章指令系统与汇编语言程序设计
2,移位指令移位操作类指令可以对字节或字数据中的各位进行算术移位,逻辑移位或循环移位 。
移位指令的格式为,SHL/SAL/SHR/SAR dst,1/ CL
循环移位指令的格式为,ROL/ ROR/ RCL/ RCR dst,1/ CL
上述指令分别对操作数进行逻辑左移 SHL,算术左移 SAL、
逻辑右移 SHR,算术右移 SAR;循环左移 ROL,循环右移 ROR、
带进位的循环左移 RCL,带进位的循环右移 RCR等操作 。 操作数可以是字节或字操作 。
图 3- 7为各种移位操作的功能示意 。
42
CF M
算术右移 SAR
CF M
逻辑右移 SHR
0
CF M
算术左移 SAL
0
CF M
逻辑左移 SHL
0
CF
带进位循环右移 RCR
CF
带进位循环左移 RCL
CF
循环右移 ROR
CF
循环左移 ROL
( 注,CF 为进位位,M 为符号位 )
图 3-7 移位指令的操作功能示意
43
第 3章指令系统与汇编语言程序设计
3.3.4 串操作类指令数据串是存储器中的一串字节或字的数据序列 。
8086指令系统中设置了串操作指令,其操作对象是内存中地址连续的字节串或字串 。 在每次操作后能够自动修改地址指针,为下一次操作作准备 。
基本串操作指令有串传送 ( MOVS),串比较
( CMPS),串扫描 ( SCAS),串存取 ( LODS、
STOS) 等 。 任何一个基本串操作指令的前面都可以加一个重复操作前缀,使指令操作重复,这样在处理长数据串时要比用循环程序速度快得多 。
44
第 3章指令系统与汇编语言程序设计
3.3.5 控制转移类指令程序的执行一般是按指令顺序逐条执行的,但有时需要改变程序的执行流程 。 控制转移类指令就是用来改变程序执行的方向,也就是修改 IP和 CS的值 。 通过控制转移指令可实现各种结构化程序设计,如分支结构程序,循环结构程序等 。
( 1) 如果指令给出改变 IP中内容的信息,转移的目标位置和转移指令在同一个代码段,则称为段内转移;
( 2) 如果指令给出改变 IP中内容的信息,又给出改变 CS中内容的信息,转移的目标位置和转移指令不在同一个代码段,
则称为段间转移 。
根据转移指令的功能,可分为无条件转移指令,条件转移指令,循环控制指令,子程序调用和返回指令 4类 。
45
第 3章指令系统与汇编语言程序设计
1,无条件转移指令无条件转移指令 JMP用来控制程序转移到指定的位置去执行,指令中要给出转移位置的目标地址,通常有以下 5种形式:
JMP SHORT opr ;段内直接短转移
JMP NEAR PTR opr ;段内直接近转移
JMP WORD PTR opr ;段内间接转移
JMP FAR PTR opr ;段间直接转移
JMP DWORD PTR opr ;段间间接转移
46
第 3章指令系统与汇编语言程序设计
2,条件转移指令条件转移指令是根据上一条指令所设置的条件码来测试,
被测试的内容为状态标志位 。 满足测试条件则转移到指令中指定的位置去执行,如果不满足条件则顺序执行下一条指令 。
条件转移指令根据判断的标志位不同,通常可以归纳为 3
类:即判断单个标志位状态,比较无符号数高低和比较带符号数大小 。 这 3类指令在使用之前,应该有比较 CMP,测试
TEST,加减或逻辑运算等指令 。
47
第 3章指令系统与汇编语言程序设计
3,循环控制指令将一段代码程序执行多次操作即为循环,采用循环控制指令实现 。 循环控制转向的目的地址是在以当前 IP内容为中心的- 128~+ 127的范围内,指令采用 CX作为计数器,每执行一次循环,CX内容减 1,直到为零后循环结束 。
( 1) 循环控制指令 LOOP
( 2) 为零或相等时循环控制指令 LOOPZ/LOOPE
( 3) 不为零或不相等时循环控制指令 LOOPNZ/LOOPNE
48
第 3章指令系统与汇编语言程序设计
4,子程序调用和返回指令
( 1) 子程序调用指令指令格式为,CALL NEAR PTR opr ;段内调用
CALL FAR PTR opr ;段间调用
( 2) 子程序返回指令 RET
指令格式,RET
或 RET 表达式
49
第 3章指令系统与汇编语言程序设计
3.3.6 处理器控制类指令这类指令主要用于修改状态标志位,控制 CPU的功能如使
CPU暂停,等待,空操作等 。
50
第 3章指令系统与汇编语言程序设计
3.4 Pentium微处理器新增指令和寻址方式
3.4.1 Pentium微处理器寻址方式
1,Pentium微处理器的内部寄存器和指令格式由于 Pentium微处理器采用 32位指令,它的内部寄存器和指令格式与 16位微处理器存在不同,主要有以下几方面:
( 1) 指令的操作数可以是 8位,16位或 32位;
( 2) 根据指令的不同操作数字段可以是 0~ 3个;
( 3) 在部分不存放结果的单操作数指令中,可以采用立即数作为操作数;
51
第 3章指令系统与汇编语言程序设计
( 4) 部分指令对操作数的数据类型不是简单地要求一致,而是要有不同的匹配关系;
( 5)立即数寻址方式中,操作数可以是 32位的立即数,寄存器寻址方式中,操作数可以是 32位通用寄存器;
( 6) 存储器操作数寻址方式中,操作数可达 32位,寻址方式既可采用 16位的地址寻址方式也可采用 32位的扩展地址寻址方式 。
( 7) 16位微处理器原有的 4个通用数据寄存器扩展为 32位,
更名为 EAX,EBX,ECX和 EDX;
( 8) 原有的 4个用于内存寻址的通用地址寄存器同样扩展为
32位,更名为 ESI,EDI,EBP,ESP;
52
第 3章指令系统与汇编语言程序设计
( 9) 指令指针寄存器扩展为 32位,更名为 EIP;
( 10) 在原有的 4个段寄存器基础上,增加了 2个新的段寄存器 FS和 GS;;
( 11) 32位微处理器增加了 4个系统地址寄存器;
( 12) 标志寄存器也扩展为 32位,更名为 EFLAGS,除了原有的状态,控制标志外,还增加了 2位;
( 13) 新增加了 5个 32位的控制寄存器,命名为 CR0~CR4;
( 14) 新增了 8个用于调试的寄存器 DR0~DR7,2个用于测试的寄存器 TR6~TR7。
53
第 3章指令系统与汇编语言程序设计
2,Pentium微处理器的新增寻址方式如前所述,8086微处理器有固定寻址,立即数寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,
基址变址寻址和相对基址变址寻址等 8种寻址方式,而 Pentium
微处理器有 11种寻址方式 。 与 8086相比新增加的 3种寻址方式分别是比例变址寻址方式,基址加比例变址寻址方式和带位移量的比例变址寻址方式 。
54
第 3章指令系统与汇编语言程序设计
3.4.2 Pentium系列微处理器专用指令
Pentium系列处理器的指令集是向上兼容的,它保留了
8086和 80X86微处理器系列的所有指令,因此,所有早期的软件可直接在奔腾机上运行 。
Pentium处理器指令集中新增加了以下 3条专用指令 。
1,比较和交换 8字节数据指令 CMPXCHG8B
2,CPU标识指令 CPUID
3,读时间标记计数器指令 RDTSC
55
第 3章指令系统与汇编语言程序设计
3.4.3 Pentium系列微处理器控制指令
Pentium处理器指令集中新增加了 3条系统控制指令 。
1,读专用模式寄存器指令 RDMSR
2,写专用模式寄存器指令 WRMSR
3,恢复系统管理模式指令 RSM
56
第 3章指令系统与汇编语言程序设计
3.5 汇编语言简述计算机可直接识别的是机器指令,用机器指令编写的程序称为机器语言程序 。 由于机器指令是用二进制编码来表示的,既不直观又难以记忆,所以使得机器指令编写的程序在使用上受到了限制 。 为了解决机器语言使用上的不便,人们开始使用容易记忆和识别的符号指令来编写程序 。 汇编语言就是用与操作功能含义相应的缩写英文字符组成的符号指令作为编程用的语言 。
57
第 3章指令系统与汇编语言程序设计使用汇编语言编写的程序计算机是不能够直接地识别和执行的,必须经过,翻译,,将汇编语言程序,翻译,成机器语言程序,这个,翻译,是由汇编程序来完成的 。 汇编程序是系统预先提供的系统软件之一,它把源文件转换成二进制编码表示的目标文件 (,OBJ),这个过程称为汇编 。 在汇编过程中对源程序进行语法检查 ( 又称扫描 ),得到无语法错误的结果后,还要经过连接程序,使目标程序成为计算机的可执行文件 (,EXE) 。
58
汇编语言源程序 经汇编程序转换为目标文件 经连接程序转换成可执行文件汇编语言程序转换成为计算机可运行的程序的过程如图 3-8所示。
图 3-8汇编语言程序的执行过程
59
第 3章指令系统与汇编语言程序设计
3.5.1 汇编语言语句的类型和格式汇编语言源程序是由指令,伪指令及宏指令组成的 。 每条指令又可称为一条语句,汇编语言程序中一条完整的语句格式由以下 4项内容组成:
[ name] operation operand [ ; comment]
( 1) 名字项 name:名字通常为一符号序列,表示本条语句的符号地址 。 名字项可用作标号和变量,作为标号表示的是符号地址,其后跟冒号,,,;作为变量表示的是一个数据,
其后不跟冒号,,,。
60
第 3章指令系统与汇编语言程序设计标号和变量具备以下 3种属性:
段属性:该属性定义了标号和变量的段起始地址,其值必须在一个段寄存器中 。 标号的段是它所出现的对应代码段,
由 CS指示 。 变量的段通常由 DS或者 ES指示 。
偏移属性:该属性表示标号和变量相距段起始地址的字节数,该数是一个 16位无符号数 。
类型属性:该属性对于标号而言,用于指出该标号是在本段内引用还是在其他段中引用 。 标号的类型有 NEAR( 段内引用 ) 和 FAR( 段间引用 ) 。 对于变量,其类型属性说明变量有几个字节长度,这一属性由定义变量的伪指令确定 。
61
第 3章指令系统与汇编语言程序设计
( 2) 操作码项 operation:为操作码助记符,可以是指令,
伪指令及宏指令名 。 汇编程序可以将指令翻译成对应的机器码;伪指令是在汇编过程中完成相应的控制操作,又称为汇编控制指令;宏指令是采用有限的一组指令来定义的代号,
汇编时将展开成相应的具体操作指令 。
( 3) 操作数项 operand:为操作码提供数据及操作信息,操作数项可以是常数,变量,表达式等数据,也可以是操作数的地址或地址表达式 。 当有两个或两个以上的操作数时,各操作数之间要用逗号隔开 。
62
第 3章指令系统与汇编语言程序设计
( 4) 注释项 comment:为语句注释,说明所在语句行的功能,以,;,开头,是语句的非执行部分 。 通常,注释用来说明一段程序或几条语句的功能,一段完整的程序注释是很重要的,它可使程序思路显得更清楚,特别是在模块化程序设计中可通过注释将各模块的功能描述出来,大大增强了程序的可读性 。
此外,语句格式中带方括号,[ ],的部分表示任选项,
可根据需要加以选择,汇编语言要求上面的 4项内容之间必须留有空格,否则会被认为是错误的命令 。
63
第 3章指令系统与汇编语言程序设计汇编语言的标识符,表达式和运算符
( 1) 标识符:如前所述,汇编语言语句格式第一个字段是它的名字项,名字可以是标号或变量,这两者又称为标识符 。
标号和变量可以用 LABLE和 EQU伪指令来定义,相同的标号或变量的定义在同一程序中只能允许出现一次 。
( 2) 表达式和运算符:表达式中的运算符充当着重要的角色 。 8086宏汇编有算术运算符,逻辑运算符,关系运算符,
分析运算符和综合运算符共 5种 。
64
第 3章指令系统与汇编语言程序设计
算术运算符用于完成算术运算,加,减,乘,除运算都是整数运算,除法运算得到的是商的整数部分,求余运算是指两数整除后所得到的余数 。
逻辑运算符对操作数进行按位操作,运算后产生一个逻辑运算值,供给指令操作数使用,不影响标志位 。 NOT是单操作数运算符,其它 3个为双操作数运算符 。
关系运算符的运算对象是两个性质相同的项目,其结果只能是两种情况:
关系成立或不成立 。 当关系成立时,运算结果为 1,否则为 0。
分析运算符用于对存储器地址进行运算,它可以将存储器地址的段,偏移量和类型属性分离出来,返回到所在的位置作操作数使用 。 故又称为数值返回运算符 。
综合运算符用来建立和临时改变变量或标号的类型以及存储器操作数的存储单元类型,也称为属性修改运算符 。
65
第 3章指令系统与汇编语言程序设计
3.5.2 汇编语言的源程序结构一个汇编语言源程序包含了以下几个结构形式:
( 1) 汇编源程序一般应该由 3个逻辑段组成,即数据段,堆栈段和代码段 。 数据段用来在内存中建立一个适当容量的工作区,以存放常数,变量等程序需要对其进行操作的数据;
堆栈段用来在内存中建立一个适当的堆栈区,以便在中断,
子程序调用时使用;代码段包括了许多以符号表示的指令,
以完成程序规定的操作 。
( 2) 每个逻辑段以 SEGMENT语句开始,以 ENDS语句结束,整个源程序以 END语句结束,每个逻辑段内有若干条语句以完成某种特定操作功能 。
66
第 3章指令系统与汇编语言程序设计
( 3) 汇编源程序的主模块要用 ASSUME伪指令告诉汇编程序,各个段地址与段寄存器之间的对应关系,以便对源程序模块进行汇编时确定段中各项的偏移量; DOS的装入程序在执行时,将把 CS初始化为正确的代码段地址,把 SS初始化为正确的堆栈段地址,在源程序中不需要再对它们进行初始化 。
由于装入程序已经将 DS寄存器留作它用,所以在源程序中要对 DS进行初始化 。
( 4) 汇编语言源程序存放在存储器中,无论是取指令还是存取操作数,都要访问内存 。 所以,程序的编写必须分段进行,以满足存储器分段管理的要求 。
67
第 3章指令系统与汇编语言程序设计
3.5.3 伪指令我们前面所分析的大都是机器指令,这是 CPU指令系统中提供的命令,在运行时由 CPU执行,每条指令对应 CPU的一种特定的操作,例如传送,加,减法等,经汇编以后,每条 CPU
指令产生一一对应的目标代码 。 而伪指令是用来对相关语句进行定义和说明的,它不产生目标代码,所以又称伪操作 。
宏汇编程序 MASM提供了约几十种伪指令,主要有数据定义,符号定义,段定义,过程定义,模块定义,结构等 。
68
第 3章指令系统与汇编语言程序设计
1,数据定义伪指令数据定义伪指令用来定义变量的类型,给变量分配存储单元 。
数据定义伪指令的一般格式为:
[变量名 ] 伪指令 数据项 [;注释 ]
数据定义伪指令 有以下 5种形式:
( 1) DB( Define Byte),定义字节变量,每个数据占 1个字节 。
( 2) DW( Define Word),定义字变量,每个数据占 1个字,即 2个字节 。
( 3) DD( Define Double word),定义双字变量,每个数据占 2个字,即
4个字节 。
( 4) DQ( Define Quadruple word),定义 4字变量,每个数据占 4个字,
即 8个字节 。
( 5) DT( Define Ten byte),定义 10字节变量,每个数据占 10个字节 。
69
第 3章指令系统与汇编语言程序设计
2,符号定义伪指令符号定义伪指令主要是为程序中的表达式赋予一个符号名,或定义新的类型属性等 。 它为程序的编写和使用带来了许多方便 。
( 1) EQU( 等值 ) 伪指令:将表达式的值或符号赋予 EQU前面的一个名字,
可以用这个名字来代替给定的表达式 。 需要注意的是,一个符号一经 EQU
伪指令赋值后,在整个程序中不允许再对同一符号重新赋值 。
( 2) = ( 等号 ) 伪指令:其功能与 EQU伪指令基本相同,主要区别在于它可以对同一个名字重复定义 。
( 3) LABLE( 标号 ) 伪指令:其用途是在原来标号或变量的基础上定义一个类型不同的新的标号或变量 。
( 4) PTR( 属性修改 ) 伪指令:用于临时指定或修改操作数的类型属性 。
70
第 3章指令系统与汇编语言程序设计
3,段定义伪指令段定义伪指令可对代码段,数据段,堆栈段及附加段进行定义和赋名,并指明段的定位类型,组合类型及类别 。 代码段的内容主要是指令及伪指令,数据段,堆栈段及附加段主要是定义数据,分配存储单元等 。
有以下两种段定义伪指令:
( 1) SEGMENT/ENDS伪指令格式,段名 [定位类型 ] [组合类型 ] [‘类别 ’ ]
… ( 段内语句系列 )
段名 ENDS
71
第 3章指令系统与汇编语言程序设计
( 2) ASSUME伪指令格式:
ASSUME 段寄存器名:段名 [,段寄存器名:段名 [,… ]]
ASSUME段寻址伪指令放置在代码段的开始处,可以设定多个段与段寄存器之间的对应关系,中间用逗号分开 。 当汇编程序汇编一个逻辑段时,可利用相应的段寄存器寻址该逻辑段中的指令或数据 。
72
第 3章指令系统与汇编语言程序设计
4,过程定义伪指令汇编语言中的子程序是以过程的形式出现的,过程的调用和返回采用 CALL和 RET指令来完成 。 过程定义伪指令的格式如下:
格式:过程名 PROC [NEAR]/FAR
… ( 过程中的语句系列 )
RET
… ( 过程中的语句系列 )
过程名 ENDP
73
第 3章指令系统与汇编语言程序设计
5,结构定义伪指令结构是将逻辑上相互关联的一组数据以某种形式组合在一起,形成一个整体以便进行数据处理 。 结构的使用需要经过结构定义,结构预置和结构引用等过程 。
结构采用伪指令 STRUC和 ENDS进行定义,把相关数据定义语句组合起来,便构成一个完整的结构 。 其格式如下:
结构名 STRUC
… ( 数据定义语句序列 )
结构名 ENDS
74
第 3章指令系统与汇编语言程序设计
6,模块定义伪指令一个较大的汇编语言源程序,按任务分配可以由多个模块组成,每个模块都是具有独立功能的逻辑单位 。 为了实现模块之间的连接,调用,
相互访问,变量传送等功能,通常使用以下几个伪指令 。
( 1) NAME伪指令:用于给源程序汇编以后得到的目标程序指定模块名,
在汇编连接时使用 。
( 2) END伪指令:表示源程序结束,指示汇编程序停止汇编,END后面的语句可以不予理会 。
( 3) PUBLIC伪指令:用于定义本模块中的某些符号是全局符号名,允许程序中的其它模块直接引用 。
( 4) EXTRN伪指令:指明本模块中所用的某些符号在程序的其它模块中已经定义,且出现在其它模块的 PUBLIC伪指令中 。
75
第 3章指令系统与汇编语言程序设计
7,定位伪指令 ORG和程序计数器 $
( 1) ORG伪指令,ORG是起始位置设定伪指令,用来指定某条语句或某个变量的偏移地址 。 在程序设计中,如果需要将存储单元分配在指定位置,可以使用 ORG伪指令来改变位置计数器的值 。
( 2) 程序计数器 $:字符,$”出现在在程序中的表达式里,
它的值为程序下一个所能分配的存储单元的偏移地址,称为程序计数器 。,$”用来表示位置计数器的当前值 。
76
第 3章指令系统与汇编语言程序设计
3.5.4 宏指令与高级汇编技术在汇编语言中,有的程序段需要多次重复使用,为了减少编程的工作量,可将它们定义为一条宏指令 。 需要时,直接在程序中将宏指令当作一条指令一样来引用 。
汇编程序在源程序的汇编过程中,将宏指令对应的程序段目标代码嵌入到该宏指令处 。 宏指令实际上也是一种伪指令,
比起前面介绍的伪指令功能更强,使用更灵活,在源程序中采用宏指令可简化程序 。
77
第 3章指令系统与汇编语言程序设计
1,宏汇编所谓,宏,是指源程序中一段具有独立功能的代码,宏指令代表一段源程序 。 当宏汇编时,宏指令就被自动地展开成为相应的机器码而插入源程序中的宏调用处,宏调用指令在汇编过程中对宏定义体作宏展开操作 。 宏展开就是用宏定义体取代源程序中的宏指令名,并用实参取代宏定义中的形参,而且要求实参要与形参一一对应 。
宏定义语句格式是:
宏指令名 MACRO [形参 1,形参 2,…,形参 n]
…… ;宏体
ENDM
78
第 3章指令系统与汇编语言程序设计
( 2) 宏调用:经定义的宏指令,可以在源程序中调用,称为宏调用 。 宏调用的格式为:
宏指令名 [实参 1,实参 2,…,实参 n]
( 3) 宏展开:宏展开就是将宏指令语句用宏定义中宏体的程序段目标代码替换 。 在汇编源程序时,宏汇编程序将对每条宏指令语句进行宏展开,取调用提供的实参替代相应的形参,对原有宏体目标代码作相应改变 。
79
第 3章指令系统与汇编语言程序设计
2,重复汇编在编写汇编程序的过程中,有时需要重复编写相同或几乎完全相同的一组代码,为避免重复编写的麻烦,可以使用重复汇编 。
重复汇编伪指令有以下 3种:
( 1) 定重复伪指令 REPT/ENDM,REPT和 ENDM必须成对出现,两者间之的重复内容是要重复汇编的部分,重复汇编次数用表达式的值来表示 。
( 2) 不定重复伪指令 IRP/ENDM:此伪指令重复执行重复内容中所包含的语句,重复的次数由参数表中的参数个数决定 。
( 3) 不定重复字符伪指令 IRPC/ENDM:此伪指令重复执行重复内容中的语句,重复汇编的次数等于字符串中字符的个数 。
80
第 3章指令系统与汇编语言程序设计
3.
条件汇编也是汇编语言提供的一组伪操作 。 伪操作指令中指出汇编程序所进行测试的条件,汇编程序将根据测试的结果有选择地对源程序中的语句进行汇编处理 。
条件伪操作的一般格式:
IF 〈 表达式 〉
[ 条件程序块 1]
[ ELSE]
[ 条件程序块 2]
ENDIF
81
第 3章指令系统与汇编语言程序设计
3.5.5 汇编语言程序上机过程
1,汇编语言的工作环境帮助建立汇编语言源程序和支持汇编语言程序运行的软件主要包括以下几个方面:
( 1) DOS操作系统:汇编语言源程序的建立和运行都是在 DOS操作系统的支持下进行的 。
( 2) 编辑程序:是用来输入和建立汇编语言源程序的一种通用的系统软件,源程序的修改也可在编辑状态进行 。
( 3) 汇编程序:一般选用宏汇编 MASM.EXE,将源程序汇编成目标程序 。
( 4) 连接程序,8086汇编语言使用的连接程序是 LINK.EXE。
( 5) 调试程序:作为一种辅助工具来帮助编程者进行程序的调试,常采用动态调试程序 DEBUG.COM。
82
第 3章指令系统与汇编语言程序设计
2,汇编语言上机步骤通常,在计算机上运行汇编语言程序的步骤主要有以下几方面:
( 1) 用编辑程序 ( 例如 EDIT.COM) 建立扩展名为,ASM的汇编语言源程序文件;
( 2) 用汇编程序 ( 例如 MASM.EXE) 将源程序文件汇编成用机器码表示的目标程序文件,其扩展名为,OBJ;
( 3) 用连接程序 ( 例如 LINK.EXE) 把目标文件转化成可执行文件,其扩展名为,EXE。 如果在汇编过程中出现语法错误,根据错误的信息提示 ( 如错误位置,错误类型,错误说明 ),用编辑软件重新调入源程序进行修改 。
( 4) 生成可执行文件后,在 DOS命令状态下直接键入文件名就可执行该文件 。
83
第 3章指令系统与汇编语言程序设计
3.6 基本程序设计程序设计的目的是把解决实际问题的方法转化为计算机程序 。 在汇编程序设计过程中,首先对要解决的问题进行具体的描述,对于较小的程序可以使用程序流程图,对于较大的程序可以采用模块化程序设计方法 。 无论采用流程图还是模块化的方法设计都要使用程序设计的基本程序结构来表现出来,基本的程序结构包括顺序结构,分支结构,循环结构及子程序结构 。
84
第 3章指令系统与汇编语言程序设计
3.6.1 程序设计的步骤和程序的基本结构
1.程序设计的基本步骤用汇编语言设计程序,一般按下述步骤进行:
( 1) 分析问题,抽象出数学模型
( 2) 确定算法或解题思想
( 3) 绘制流程图
( 4) 程序编制
( 5) 程序的运行,检查与调试
85
第 3章指令系统与汇编语言程序设计
2,程序的基本结构程序的基本结构通常可以分为顺序结构,分支结构和循环结构 3种 。 每一个结构只有一个入口和一个出口,3种结构的有机组合和嵌套可构成结构化程序 。
( 1) 顺序结构:该结构是按照语句的先后次序执行一系列的顺序操作,
没有分支和跳转 。
( 2) 分支结构:也叫条件选择结构,可根据不同情况做出判断和选择,
以便执行不同的程序段 。 分为双分支结构和多分支结构 。
( 3) 循环结构:循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的 。 按照条件判断的位置,可以把循环分为,当型循环,和,直到型循环,
86
第 3章指令系统与汇编语言程序设计
3.6.2 顺序结构程序设计顺序结构是一种最简单的程序设计结构形式 。 采用这种结构只能完成简单的任务程序设计 。 顺序结构在任何结构的程序中都会出现,因此,它是构成复杂程序的基础 。
【 例 3.32】 用顺序结构来编程实现求 S=( X2+ Y2) /Z的值,将最后结果放入 RESULT单元保存 。
本题中要定义 4个变量,X,Y,Z是计算表达式涉及到的数据,RESULT单元是结果的存放单元 。 为方便数据的重复使用,采用寄存器来存放中间结果 X2和 Y2。
87
参考程序如下:
DATA SEGMENT ;定义数据段
X DB 5 ;给 X,Y,Z赋初值
Y DB 7
Z DB 2
RESULT DB? ;定义 RESULT单元,预留空间
DATA ENDS ;数据段结束
CODE SEGMENT ;定义代码段
ASSSUME CS,CODE,DS,DATA
START,MOV AX,DATA ;初始化 DS
MOV DS,AX
MOV AL,X ;将数据 X送 AL
MUL X ;计算 X2
MOV BX,AX ;将中间结果保存到 BX
MOV AL,Y ;将数据 Y送 AL
MUL Y ;计算 Y2
ADD AX,BX ; X2+Y2,结果保存到 AX
DIV Z ;计算 ( X2+ Y2) /Z
MOV RESULT,AL ;最后结果送 RESULT单元
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS ;代码段结束
END START ;汇编结束
88
第 3章指令系统与汇编语言程序设计
3.6.3 分支结构程序设计在解决某些实际问题时,采用的方法会随着某些条件的不同而不同,这种在不同条件下处理的程序称为分支程序,
采用分支结构设计的程序结构上清晰,易于阅读及调试 。
程序中所产生的分支是由条件转移指令来完成的 。 汇编语言提供了多种条件转移指令,可以根据使用不同的转移指令所产生的结果状态选择要转移的程序段,对给定问题进行处理 。
89
第 3章指令系统与汇编语言程序设计
1,单分支程序设计单分支结构是分支程序中最简单的一种形式,由它可组成其它复杂程序的基本结构 。 程序设计时要明确需要判断的条件,并选择合适的条件转移语句 。
【 例 3.33】 编程实现将键盘输入的小写字母转换为大写字母显示出来 。
从键盘接收数据后,在程序内要判断接收的是否是小写字母,是则进行转换,否则不予转换,这样就需要判断所输入字符是否在 ‘ a’和 ‘ z’的范围内,采用单分支结构即可实现 。
转换后结果的显示通过 DOS功能调用的 02号功能,将要显示字符的
ASCII码放在 DL中 。
90
参考程序如下:
CODE SEGMENT
ASSUME CS,CODE
START,MOV AL,01H ;采用 DOS调用的 01号功能,从键盘输入字符
INT 21H
CMP AL,‘ a’ ;与字符 ‘ a’进行比较
JB EXIT ;小于 ‘ a’,转向结束
CMP AL,‘ z’ ;与字符 ‘ z’进行比较
JA EXIT ;大于 ‘ z’,转向结束
SUB AL,20H ;大小写字母间相差 20H
MOV DL,AL ;转换后,结果送 DL
MOV AH,02H ; DOS调用 02号功能,显示结果
INT 21H
EXIT,MOV AH,4CH ;返回 DOS
INT 21H
CODE END ;代码段结束
END START ;汇编结束
91
第 3章指令系统与汇编语言程序设计
2,多分支程序设计当程序中需要根据不同判断条件进行多项操作时,就要用到多路分支结构形式 。
【 例 3.34】 编写程序,完成下面的分段函数的计算,给定 X为带符号的字节数据 。
1 X> 0
Y= 0 X= 0
- 1 X< 0
这是 3路分支的程序设计,根据题目要求 X为内存中的一个带符号数 。
采用两重条件判断:首先判断 X值的正负,若为负数,将- 1送到 Y中保存;
若为正数,再判断 X是否为 0,如果为 0,将 0送到 Y中保存,否则将 1送到 Y
中保存 。
92
程序设计如下:
DATA SEGMENT
X DB -10
Y DB?
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA
MOV DS,AX ;初始化 DS
MOV AL,X ; X取到 AL中
CMP AL,0 ; AL和 0比较
JGE BIG ; ≥ 0,转 BIG
MOV BL,-1 ;否则 -1送 BL
JMP EXIT ;转到结束位置
BIG,JE MIN ; AL=0转 MIN
MOV BL,1 ;否则 1送 BL
JMP EXIT ;转到结束位置
MIN,MOV BL,0 ; 0送 BL
EXIT,MOV Y,BL ; BL中内容送 Y
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS ;代码段结束
END START ;汇编结束
93
第 3章指令系统与汇编语言程序设计
3.6.4 循环结构程序设计
1,循环程序的基本结构使用循环结构的形式设计程序时,通常将循环程序划分为 4
( 1) 初始化部分:对循环程序的初始状态进行设置 。
( 2) 循环体:是完成循环工作的主要部分,要重复执行这段操作 。
( 3) 参数修改部分:为保证每次循环的正常执行,计数器值,操作数地址指针等相关信息要发生有规律的变化,为下一次循环作准备 。
( 4) 循环控制部分:每个循环程序必须选择一个恰当的循环控制条件来控制循环的运行和结束 。 如果循环次数已知可使用计数器来控制,如果循环次数未知应根据具体情况设置控制循环结束的条件 。
94
第 3章指令系统与汇编语言程序设计
2,单重循环程序设计此种情况下,在程序中只需要一个循环过程即可完成规定的操作 。
【 例 3.35】 设计一个程序来完成求 1~100的累加和,结果送到
SUM单元中 。
该题目的循环次数是已知的,可以采用计数控制的方法 。
程序中用递增计数法来实现求累加和 。
95
程序设计如下:
DATASEGMENT
SUM DW? ;预留结果单元
CN EQU 100 ;计数终止值
DATA ENDS
CODE SEGMENT
ASSUME DS,DATA,CS,CODE
START,MOV AX,DATA ;初始化 DS
MOV DS,AX
MOV AX,0 ;累加器清零
MOV CX,1 ;置循环计数初始值
LP,ADD AX,CX ;求累加和
INC CX ;计数器加 1
CMP CX,CN ; CX和终止值比较
JBE LP ;小于等于终止值,转循环入口处 LP
MOV SUM,AX ;超过计数终止值,结果送 SUM单元
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS
END START ;汇编结束
96
第 3章指令系统与汇编语言程序设计
3,多重循环程序设计如果在一个循环体中又出现另一个循环操作即为多重循环程序,也称为循环嵌套 。 使用多重循环时要注意以下几个问题:
( 1) 内循环必须完整地包含在外循环中,循环可以嵌套和并列,但内外循环不能相互交叉;
( 2) 可以从内循环直接跳到外循环,但不能从外循环直接跳到内循环;
( 3) 无论是内循环还是外循环,都不要使循环回到初始化部分,否则将出现死循环;
( 4) 每次完成外循环再次进入内循环时,初始条件必须重新设置 。
97
第 3章指令系统与汇编语言程序设计
【 例 3.36】 在内存 BUF单元开始的区域中存放有一组无符号的字节数据,试编程序将这些数据按从小到大的顺序排序,
排序后的数据依然放在原来的存储区中 。
采用冒泡法来设计程序 。 设从地址 BUF开始的内存缓冲区中有 N个元素组成的字节数组,按照从小到大的次序排列:
将第一个存储单元中的数与其后 N-1个存储单元中的数逐一进行比较,如果数据的排列次序符合要求,不做任何操作;
否则两数交换位置 。 经过第一轮的 N- 1次比较,N个数据中的最小数放到了第一个存储单元中 。
98
第 3章指令系统与汇编语言程序设计第二轮处理时,将第二个存储单元中的数据与其后的 N-
2个存储单元中的数据逐一比较,每次比较后都把小数放到第二个存储单元中,经过 N-2次比较后,N个数据中的第二个小数存入了第二个存储单元 。
依次类推,做同样的操作,当最后两个存储单元中的数据比较完毕后,就完成了 N个数据从小到大的排序 。
99
程序设计如下:
DATA SEGMENT
BUF DB 23H,09H,14H,53H,67H,89H,4FH,20H,A5H,10H
CN EQU $-BUF
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA ;初始化 DS
MOV DS,AX
MOV CX,CN-1 ;外循环次数送计数器 CX
LP1,MOV SI,0 ;数组起始下标 0送 SI
PUSH CX ;外循环计数器入栈
LP2,MOV AL,BUF [SI] ; BUF [SI]取出送 AL
CMP AL,BUF [SI+1] ; BUF [SI]和 BUF [SI+1]比较
JLE NEXT ;小于或等于转 NEXT
XCHG AL,BUF[SI+1] ;否则 BUF [SI]和 BUF [SI+1]交换
MOV BUF [SI],AL
NEXT,INC SI ;数组下标加 1
LOOP LP2 ; CX-1不为 0转 LP2
POP CX ;否则退出内循环,将 CX出栈
LOOP LP1 ; CX-1不为 0转 LP1
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS
END START ;汇编结束
100
第 3章指令系统与汇编语言程序设计
3.6.5 子程序设计在计算机的应用系统中,经常把一些常用的具有一定功能的程序段进行标准化,单独存放在某一存储区域中,需要执行的时候,再使用专门指令调用,这种程序段就称为子程序 。 在汇编语言中,子程序又称为过程,调用子程序的程序段称为主程序,主程序中 CALL指令的下一条指令的地址称为返回地址 。
程序采用子程序结构具有以下优点:
( 1) 可以简化程序设计过程,大量节省程序设计时间 。
( 2) 可缩短程序的长度,节省汇编时间和程序的存储空间 。
( 3) 增加了程序的可读性,便于对程序进行修改和调试 。
( 4) 为程序的模块化,结构化和自顶向下的设计提供了方便 。
101
1,子程序的调用下面说明子程序的基本结构和主 -子程序之间的调用关系 。
【 例 3.37】 采用主程序调用 子程序的结构形式,完成 N个数据的累加和计算 。 该 N个数据为字节型数据,存放在开始地址为 ADRR的内存单元 。
主程序段如下:
MAIN PROC FAR ;主程序开始
START,PUSH DS ;保护现场
MOV AX,0 ;累加器清零
PUSH AX ; AX内容入栈
CALL SUBP ;调用过程 SUBP
RET ;返回
MAIN ENDP ;主程序定义结束子程序段如下:
SUBP PROC ;子程序开始
MOV AX,DATA ;初始化 DS
MOV AX,DS
LEA SI,ADRR ;取数据的有效地址
MOV CX,N ;取数据个数
NEXT,ADD AL,[SI] ;数据累加
ADC AH,0 ;带进位加
INC SI ;地址加 1
LOOP NEXT ;循环控制
RET ;返回主程序
SUBP ENDP ;子程序定义结束
102
第 3章指令系统与汇编语言程序设计从本例可以看出主 -子程序的基本结构包括以下几个部分:
( 1) 主 -子程序说明:用来说明主 -子程序的名称,功能,入口参数,出口参数,占用工作单元的情况,明确调用方法 。
( 2) 现场保护及恢复:通常主程序已经占用了一定的寄存器,
子程序执行时也会用到相关寄存器,为了保证主程序按原有状态继续正常执行,需要对这些寄存器的内容加以保护 。 此外,子程序执行完毕后要恢复这些被保护的寄存器的内容 。
现场保护及恢复通常采用堆栈操作 。
( 3) 子程序体:这一部分内容用来实现相应的子程序功能 。
( 4) 子程序返回:返回语句 RET和调用语句 CALL是相互对应的 。
103
第 3章指令系统与汇编语言程序设计
2,子程序的参数传递主程序在调用子程序之前,必须把需要加工处理的数据传递给子程序,这些被加工处理的数据称为输入参数;当子程序执行完毕返回主程序时,应把本次加工处理的结果传递给主程序,这些结果称为输出参数 。 我们把主程序向子程序传递输入参数以及子程序向主程序传递输出参数称为主程序和子程序间的参数传递 。
汇编语言中实现参数传递的方法主要有 3种:
( 1) 寄存器传递
( 2) 堆栈传递
( 3) 存储器传递
104
第 3章指令系统与汇编语言程序设计
3.7 系统功能调用磁盘操作系统 DOS( Disk Operating System) 是 PC机上最重要的操作系统,DOS功能调用可完成对文件,设备,内存的管理 。 对用户来说,这些功能模块就是几十个独立的中断服务程序,这些程序的入口地址已由系统置入中断向量表中,
在汇编语言程序中可用中断指令直接调用 。 DOS模块提供了更多更必要的测试,使 DOS操作更简易,而且对硬件的依赖性更少 。
105
第 3章指令系统与汇编语言程序设计
8086存储器系统 8K的 ROM中存放有基本输入输出系统
BIOS( Basic Input/Output System,) 例行程序 。 BIOS给 PC
系列的不同微处理器提供了兼容的系统加电自检,引导装入,
主要 I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断 。 使用 BIOS功能调用,给程序员编程带来极大方便 。 程序员不必了解硬件的具体细节,可直接使用指令设置参数,并中断调用 BIOS例行程序,所以利用 BIOS功能调用编写的程序简洁,可读性好,而且易于移植 。
106
第 3章指令系统与汇编语言程序设计
DOS与 BIOS功能都是通过软件中断来调用的 。 在中断调用前需要把功能号装入 AH寄存器,把子功能号装入 AL寄存器,
除此之外,还需要在 CPU的寄存器中提供专门的调用参数 。
一般来说,调用 DOS或 BIOS功能时,有以下几个步骤:
( 1) 将调用参数装入指定的寄存器 。
( 2) 如需功能调用号,把它装入 AH。
( 3) 如需子功能调用号,把它装入 AL。
( 4) 按中断号调用 DOS或 BIOS。
( 5) 检查返回参数是否正确 。
107
第 3章指令系统与汇编语言程序设计
3.7.1 DOS功能调用
1,系统功能调用的方法要完成 DOS系统的功能调用,按如下基本步骤操作:
( 1) 将入口参数送到指定寄存器中;
( 2) 子程序功能号送入 AH寄存器中;
( 3) 使用 INT 21H指令转入子程序入口执行相应操作 。
108
第 3章指令系统与汇编语言程序设计
2,常用的几种系统功能调用
( 1) AH= 01H;带显示的键盘输入
( 2) AH= 02H;从显示器上输出单个字符
( 3) AH= 05H;从打印机上输出单个字符
( 4) AH= 07H;不带显示的键盘输入,对 Ctrl+Break组合键无反应
( 5) AH= 08H;不带显示的键盘输入,对 Ctrl+Break组合键有反应
( 6) AH= 09H;在显示器上输出字符串
( 7) AH= 0AH;将字符串输入到内存缓冲区
( 8) AH= 4CH;程序退出并返回 DOS
109
第 3章指令系统与汇编语言程序设计
3.7.2 BIOS中断调用
BIOS为用户程序和系统程序提供主要外设的控制功能,
如系统加电自检,引导装入及对键盘,磁盘,磁带,显示器,
打印机,异步串行通信口等的控制 。 计算机系统软件就是利用这些基本的设备驱动程序,完成各种功能操作 。 每个功能模块的入口地址都在中断矢量表中,通过中断指令 INT n可以直接调用 。 n是中断类型号,每个类型号 n对应一种 I/O设备的中断调用,每个中断调用又以功能号来区分其控制功能 。
110
第 3章指令系统与汇编语言程序设计常用的 BIOS中断调用主要有:
( 1) INT 10H;显示器输出中断调用
( 2) INT 13H;低级磁盘输入输出中断调用
( 3) INT 14H;串行通信口输入输出中断调用
( 4) INT 16H;键盘输入中断调用
( 4) INT 17H;打印机输出中断调
( 5) INT 1AH;实时时钟服务中断调用有关 BIOS中断调用的类型号、功能、入口参数和出口参数可参见附录。
111
第 3章小结本章小结
8086指令系统和寻址方式是汇编语言程序设计的基础,
应该熟练掌握其具体内容、特点和应用场合。 8086CPU指令按操作数类别可分为隐含操作数指令、单操作数指令和双操作数指令 3种;按操作数的存放位置可以分为立即数、寄存器操作数、存储器操作数和 I/O端口操作数 4种类型。为了获得操作数的存放位置,就要对其寻址,寻找操作数地址的方式称为寻址方式。 8086有立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址等方式。要熟悉各种寻址方式的特点和区别,尤其要掌握存储器寻址方式中的有效地址 EA和物理地址 PA的计算方法。
指令系统与汇编语言程序设计
112
第 3章小结
8086CPU指令系统按功能可分为数据传送类、算术运算类、逻辑运算类、串操作类、控制转移类、
处理器控制类等指令。状态标志是 CPU进行条件判断和控制程序执行流程的依据,大多数指令的执行不影响标志位,某些指令的执行会按照规则影响标志位,还有一些指令会按特定方式影响标志位,在实际应用中要特别注意。应该正确理解和运用各种指令的格式、功能和注意事项来为程序设计服务。
指令系统与汇编语言程序设计
113
第 3章汇编语言程序设计有 4种基本的程序结构和设计方法 。 顺序结构是按照语句的先后次序执行一系列的操作,是最简单的一种结构 。 分支结构是程序设计中常用的结构之一,它有双分支和多分支两种形式 。 循环结构用来实现需要重复执行的操作,通常由循环初始化,循环处理部分,循环修改部分和循环控制部分 4部分组成 。 另外,汇编语言可以充分利用和发挥计算机硬件的特性与优势,因此成为编写高性能软件最有效的程序设计语言 。
本章还简要介绍了 DOS系统功能调用和 BIOS中断调用的使用方法,对键盘,显示器,打印机等设备的输入 /输出方法是经常使用的,今后如果用到系统中断调用的其它功能可以查看有关资料 。
指令系统与汇编语言程序设计
114
第 3章内容到此结束谢谢各位 !
本章主要教学内容
指令格式及寻址的有关概念
8086CPU指令系统的寻址方式及其应用
8086CPU各类指令的表示,功能,特点及其应用
Pentium微处理器新增指令和寻址方式介绍
汇编语言的基本表达方式和内容
汇编语言程序设计的基本步骤和基本方法
顺序,分支,循环,子程序基本结构和设计方法
常用的 DOS和 BIOS中断调用简介第 3章指令系统与汇编语言程序设计
2
本章教学目的及要求通过学习,使学生掌握指令的寻址方式,
指令系统及其应用;学会程序设计的基本方法;掌握程序设计的技巧,保证程序设计的质量 。
第 3章指令系统与汇编语言程序设计
3
第 3章
3.1 指令格式及寻址
1,指令系统与指令格式在计算机中要执行的各种操作命令称为指令 。 计算机所能执行的全部命令的集合即为该计算机的指令系统 。
计算机指令以二进制编码的形式存放在存储器中,用二进制编码形式表示的指令称为机器指令,CPU可以直接识别机器指令 。 人们采用一些助记符 —— 通常是指令功能的英文单词的缩写,如数据传送指令用助记符 MOV( MOVE的缩写 ),这样表示的指令称为符号指令,也称为汇编指令 。 汇编指令具有直观,
易理解,好记忆的特点 。
指令系统与汇编语言程序设计
4
第 3章指令系统与汇编语言程序设计计算机中的汇编指令由操作码字段和操作数字段两部分组成 。
( 1) 操作码字段:操作码表示计算机要执行的某种指令功能,由它来规定指令的操作类型,说明计算机要执行的具体操作,例如传送,运算,移位,跳转等操作 。 同时还指出操作数的类型,操作数的传送方向,寄存器编码或符号扩展等,
是指令中必不可少的组成部分 。
( 2) 操作数字段:操作数表示计算机在操作中所需要的数据,或者所需数据的存放位置 ( 也称为地址码 ),还可以是指向操作数的地址指针或其它有关操作数据的信息 。
5
8086的指令格式如图 3-1所示,指令的长度范围是 1~ 6个字节。其中,操作码字段为 1~ 2个字节( B1,B2),操作数字段为 0~ 4个字节( B3~ B6)。每条具体指令的长度将根据指令的操作功能和操作数的形式而定。
图 3-1 8086的指令格式
OP code low disp或 data high disp 或 data low data high data
B 1 B 2 B 3 B 4 B 5 B 6
OP code
第 3章指令系统与汇编语言程序设计
6
第 3章指令系统与汇编语言程序设计
2,寻址及寻址方式的概念计算机的指令中通常要指定操作数的位置,即给出操作数的地址信息,在执行时需要根据这个地址信息找到需要的操作数,这种寻找操作数的过程称为寻址 。 寻址方式就是寻找操作数或操作数地址的方式 。
不同机器的指令系统都规定了一些寻址方式以供编程时选择使用,根据给定的寻址方式,就可以方便地访问各类操作数 。
7
第 3章指令系统与汇编语言程序设计
8086指令中的操作数有三种可能的存放位置:
( 1) 操作数直接在指令中,即跟随在指令操作码之后,指令的操作数部分就是操作数本身,这种操作数叫立即操作数 。
( 2) 操作数存放在 CPU的某个内部寄存器中,这时指令的操作数部分是 CPU内部寄存器的一个编码,称为寄存器操作数 。
( 3) 操作数存放在内存储器的数据区中,这时指令的操作数部分包含此操作数所在的内存地址,称为存储器操作数 。
8
第 3章指令系统与汇编语言程序设计
3.2 8086 CPU的寻址方式
3.2.1 立即数寻址立即数寻址方式是指操作数直接存放在给定的指令中,紧跟在操作码之后 。
立即数可以是 8位或 16位二进制数 。 例如,给定如下指令,
采用立即数寻址:
MOV AL,10 ; 十进制数 ( D )
MOV AL,00100101B ; 二进制数 ( B )
MOV AX,263AH ; 十六进制数 ( H )
9
第 3章指令系统与汇编语言程序设计
3.2.2 寄存器寻址寄存器寻址方式是在指令中直接给出寄存器名,寄存器中的内容即为所需操作数 。 在寄存器寻址方式下,操作数存在于指令规定的 8位,16位寄存器中 。 寄存器可用来存放源操作数,也可用来存放目的操作数 。
寄存器寻址方式是 CPU内部的操作,不需要访问总线周期,
因此指令的执行速度比较快 。
对于 16位操作数,寄存器可以是 AX,BX,CX,DX,SI、
DI,SP,BP等 。
对于 8位操作数,寄存器可以是 AH,AL,BH,BL,CH,CL、
DH,DL等 。
10
第 3章指令系统与汇编语言程序设计
3.2.3 存储器寻址计算机中访问内存的寻址方式有多种,不管哪一种寻址方式,最终都将得到存放操作数的物理地址 。
采用存储器寻址时,指令中需要给出操作数的地址信息 。
存储器操作数的有效地址 EA的计算方法和寻址方式有着密切地联系,而操作数物理地址 PA的计算则和操作数的具体存放位置有关 。
11
第 3章指令系统与汇编语言程序设计
1.
直接寻址方式是一种针对内存的寻址方式 。 在这种寻址方式下,指令中给出的地址码即为操作数的有效地址 EA,它是一个 8位或 16位的位移量 。 在默认方式下,操作数存放在数据段 DS中,如果要对除 DS段之外的其他段如 CS,ES,SS中的数据寻址,应在指令中增加前缀,指出段寄存器名,这称为段跨越 。
在直接寻址方式的指令中,操作数的有效地址 EA已经给出,那么操作数的物理地址为,PA= ( DS) × 10H+ EA。
12
第 3章指令系统与汇编语言程序设计
2,寄存器间接寻址方式寄存器间接寻址方式是指操作数的有效地址 EA在指定的寄存器中,这种寻址方式是在指令中给出寄存器,寄存器中的内容为操作数的有效地址 。
16位操作数寻址时,EA放在基址寄存器 BX,BP或变址寄存器 SI,DI中,所以该方式下操作数的物理地址计算公式有以下几个:
物理地址 PA= ( DS) × 10H+ ( BX)
物理地址 PA= ( DS) × 10H+ ( DI)
物理地址 PA= ( DS) × 10H+ ( SI)
物理地址 PA= ( SS) × 10H+ ( BP)
13
第 3章指令系统与汇编语言程序设计
3,寄存器相对寻址方式这种寻址方式是在指令中给定一个基址寄存器或变址寄存器和一个 8位或 16位的相对偏移量,两者之和作为操作数的有效地址 。 当选择间址寄存器 BX,SI,DI时,指示的是数据段中的数据,选择 BP作间址寄存器时,指示的是堆栈段中的数据 。
有效地址计算为,EA= ( reg) + 8位或 16位偏移量;其中 reg为给定寄存器 。
物理地址计算为:
PA= ( DS) × 10H+ EA ( 使用 BX,SI,DI间址寄存器 )
PA= ( SS) × 10H+ EA ( 使用 BP作为间址寄存器 )
14
第 3章指令系统与汇编语言程序设计
4,基址变址寻址方式在基址变址寻址方式中,有效地址 EA是基址寄存器加变址寄存器,即两个寄存器的内容之和为操作数的有效地址 。
在该寻址方式中,当基址寄存器和变址寄存器的默认段寄存器不同时,一般由基址寄存器来决定默认用哪一个段寄存器作为段基址指针 。 若在指令中规定了段跨越,则可以用其他寄存器作为段基地址 。
基址变址寻址方式的物理地址计算公式为:
物理地址 PA= ( DS) × 10H+ ( BX) + ( SI)
物理地址 PA= ( SS) × 10H+ ( BP) + ( DI)
15
第 3章指令系统与汇编语言程序设计
5,相对基址变址寻址方式这种寻址方式是在指令中给出一个基址寄存器,一个变址寄存器和 8位或 16位的偏移量,三者之和作为操作数的有效地址 。
基址寄存器可取 BX或 BP,变址寄存器可取 SI或 DI。
如果基址寄存器采用 BX,则段寄存器使用 DS;
如果基址寄存器采用 BP,则段寄存器使用 SS。
其物理地址计算为:
PA= ( DS) × 10H+ ( BX) + ( SI) 或 ( DI) +偏移量
PA= ( SS) × 10H+ ( BP) + ( SI) 或 ( DI) +偏移量
16
第 3章指令系统与汇编语言程序设计
3.2.4 I/O端口寻址由于 8086CPU的 I/O端口采用独立编址方式,可有 64K个字节端口或 32K个字端口 。 指令系统中设有专门的输入指令 IN和输出指令 OUT来进行访问,I/O
端口的寻址方式有直接端口寻址和寄存器间接端口寻址两种 。
17
第 3章指令系统与汇编语言程序设计
1,直接端口寻址直接端口寻址是在指令中直接给出要访问的端口地址,一般采用 2位十六进制数表示,可访问的端口数为 0~ 255个 。
例如,IN例如,IN AL,30H ;表示从 I/O端口地址为 30H的端口中取出字节数据送到 8位寄存器 AL中 。
IN AX,50H ;表示从 I/O端口地址为 50H和
51H的两个相邻端口中取出字数据送到 16位寄存器 AX
中 。
18
第 3章指令系统与汇编语言程序设计
2,寄存器间接端口寻址当访问的端口地址数 ≥256时,直接端口寻址不能满足要求,要采用 I/O端口的间接寻址方式 。 它是把
I/O端口的地址先送到寄存器 DX中,用 16位的 DX作为间接寻址寄存器 。 此种方式可访问的端口数为 0~
65535个 。
例如,MOV DX,283H ;将端口地址 283H送到 DX寄存器 。
OUT DX,AL ;将 AL中的内容输出到 DX
所指定的端口中 。
19
第 3章指令系统与汇编语言程序设计
3.3 8086 CPU的指令系统
8086指令系统是 80X86/Pentium微处理器的基本指令集 。 指令的操作数可以是 8位或 16位,偏移地址是 16位 。 按功能可将指令分成六大类,即:数据传送类指令,算术运算类指令,逻辑运算与移位类指令,串操作类指令,控制转移类指令和处理器控制类指令 。
20
第 3章指令系统与汇编语言程序设计
3.3.1 数据传送类指令数据传送类指令的基本功能是把操作数或操作数的地址传送到指定的寄存器或存储单元中 。 数据传送类指令共有 14条,
根据传送的内容可分成以下 4组:
( 1) 通用数据传送指令;
( 2) 累加器专用传送指令;
( 3) 地址传送指令;
( 4) 标志寄存器传送指令 。
21
第 3章指令系统与汇编语言程序设计
1,通用数据传送指令
( 1) 传送指令 MOV
格式,MOV dst,src
MOV 指令的功能是 把源操作数 src传送至目的操作数
dst,执行后 源操作数内容不变,目的操作数内容与源操作数内容相同 。
源操作数可以是通用寄存器,段寄存器,存储器以及立即数,目标操作数可以是通用寄存器,段寄存器 ( CS除外 ) 或存储器 。
22
通用寄存器
( AX,BX,CX,DX,
SI,DI,BP,SP )
存储器立即数段寄存器
( CS,DS,SS,ES )
数据之间的传送关系如图 3-5所示。
图 3-5 数据之间的传送关系
23
第 3章指令系统与汇编语言程序设计使用 MOV指令进行数据传送时要注意以下几点:
( 1) 段寄存器 CS及立即数不能作为目标操作数;
( 2) 两个存储单元之间不允许直接传送数据;
( 3)立即数不能直接传送到段寄存器;
( 4)两个段寄存器之间不能直接传送数据;
( 5) 传送数据的类型必须匹配;
( 6) MOV指令不影响标志 位。
24
第 3章指令系统与汇编语言程序设计
( 2) 堆栈操作指令 PUSH/POP
进栈指令,PUSH opr ; SP← SP- 2,将源操作数 opr压入堆栈出栈指令,POP opr ;栈顶弹出字数据到目标操作数 opr,SP← SP+2
堆栈是存储器中的一个特殊区域,主要用于存入和取出数据,堆栈是以,先进后出,的方式进行数据操作的 。 在 8086的堆栈组织中,堆栈从高地址向低地址方向生长,它只有一个出入口,堆栈指针寄存器 SP始终指向堆栈的栈顶单元
25
第 3章指令系统与汇编语言程序设计
( 3) XCHG 交换指令
XCHG指令用来将源操作数和目的操作数的内容进行交换 。 它可以实现字节数据交换,也可以实现字数据交换 。
该指令的操作数必须有一个是在寄存器中,即可以在两个通用寄存器之间或寄存器与存储器之间交换数据,但不能在两个存储器之间交换数据 。 指令执行结果不影响标志位 。
26
第 3章指令系统与汇编语言程序设计
2,累加器专用传送指令
8086指令系统中将累加器 AX作为数据传输的核心,系统的输入 /输出指令 IN/OUT和换码指令 XLAT就是专门通过累加器来执行的,称之为累加器专用传送指令 。
27
第 3章指令系统与汇编语言程序设计
3,地址传送指令
8086的地址传送指令用于控制寻址机构,它可将存储器操作数的地址传送到 16位目标寄存器中 。 这类指令有以下 3
种形式:
( 1) 有效地址送寄存器指令,LEA reg,src
LEA指令功能是将存储器操作数 src的有效地址传送到 16位的通用寄存器 reg。
( 2) 地址指针送寄存器和 DS指令,LDS reg,src
该指令完成一个 32位的地址指针传送,地址指针包括段地址和偏移地址两部分 。
( 3) 地址指针送寄存器和 ES指令,LES reg,src
LES指令执行的操作与 LDS指令相似,不同之处是以 ES代替 DS。
28
第 3章指令系统与汇编语言程序设计
4,标志寄存器传送指令
8086可通过这类指令读出当前标志寄存器中各标志位的内容,也可以重新设置各标志位的值 。 标志寄存器的传送指令共有 4条,均位单字节指令,指令的操作数以隐含形式出现,隐含为 AH寄存器 。
( 1) 取标志指令 LAHF
( 2) 置标志位指令 SAHF
( 3) 标志寄存器入栈指令 PUSHF
( 4) 标志寄存器出栈指令 POPF
29
第 3章指令系统与汇编语言程序设计
3.3.2 算术运算类指令
8086的算术运算类指令包括加,减,乘,除 4种基本运算指令,以及为进行 BCD码十进制数运算而设置的各种较正指令 。
8086的基本算术运算指令中,除加 1和减 1指令外,
其余均为双操作数指令,两个操作数中除了源操作数可为立即数外,必须有一个操作数在寄存器中,
而单操作数指令则不允许采用立即数方式 。
30
第 3章指令系统与汇编语言程序设计加减法运算在执行过程中会产生溢出,无符号数运算时,如果加法运算最高位向前产生进位或减法运算最高位向前有借位,则表示出现溢出,采用标志位 CF=1来表示;带符号数采用补码运算时,符号位也参与运算,出现溢出则表示运算结果发生了错误,采用标志位 OF=1来表示 。
31
第 3章指令系统与汇编语言程序设计算术运算指令除加 1指令 INC不影响 CF标志外,其余指令对 CF,OF,ZF,SF,PF,AF等 6个标志位均可产生影响,其规则如下:
无符号数运算产生溢出时,CF= 1;
带符号数运算产生溢出时,OF= 1;
当运算结果为 0时,ZF= 1;
当运算结果为负数时,SF= 1;
当运算结果中有偶数个 1时,PF= 1;
当操作数为 BCD码,低 4位出现进位 1时,AF= 1。
32
第 3章指令系统与汇编语言程序设计
1,加法指令
( 1) 不带进位加法指令,ADD dst,src
指令功能为,( dst) ← ( dst) +( src)
( 2) 带进位的加法指令,ADC dst,src
指令功能为,( dst) ← ( dst) +( src) +CF
( 3) 加 1指令,INC opr
指令功能为,( opr) ← ( opr) +1
33
第 3章指令系统与汇编语言程序设计
2,减法指令
( 1) 不带借位减法指令,SUB dst,src
指令功能为,( dst) ← ( dst) - ( src)
( 2) 带借位的减法指令,SBB dst,src
指令功能为,( dst) ← ( dst) - ( src) - CF
( 3) 减 1指令,DEC opr
指令功能为,( opr) ← ( opr) - 1
( 4) 求补指令,NEG opr
该指令将 opr中的内容取 2的补码,相当于将 opr中的内容按位取反后末位加 1。
( 5) 比较指令,CMP opr1,opr2
指令功能为,( opr1) - ( opr2)
34
第 3章指令系统与汇编语言程序设计
3,乘法运算指令乘法指令包括无符号数和带符号数相乘的指令,
指令中只给出乘数,被乘数隐含给出 。 两个 8位数相乘时被乘数放入 AL中,16位数的乘积存放到 AX中;
两个 16位数相乘时被乘数先放入 AX寄存器中,32位数的乘积放到 DX和 AX两个寄存器中,规定 DX中存放高 16位,AX中存放低 16位 。
35
第 3章指令系统与汇编语言程序设计
( 1) 无符号数乘法指令,MUL src
若 src为字节数据,执行 AX← ( AL) × ( src) ;
若 src为字数据,执行 DX,AX← ( AX) × ( src)
( 2) 带符号数乘法指令,IMUL src
该指令的执行功能与 MUL相同 。
36
第 3章指令系统与汇编语言程序设计
4,除法运算指令除法指令可用来实现两个无符号数或带符号数的除法运算,包括字和字节两种操作,该指令隐含使用 AX和 DX作为一个操作数,指令中给出的源操作数为除数 。
( 1) 无符号数除法指令,DIV src
DIV指令的被除数,除数,商和余数全部为无符号数 。
( 2) 带符号数除法指令,IDIV src
IDIV指令的被除数,除数,商和余数均为带符号数,且余数的符号位同被除数 。
两条指令执行的操作功能如下:
当除数 src为字节数据时,用 AX除以 src,得到的 8位商保存在 AL中,8
位余数保存在 AH中;
当除数 src为字数据时,用 DX,AX除以 src,得到的 16位商保存在 AX中,
16位余数保存在 DX中 。
37
第 3章指令系统与汇编语言程序设计
5,符号扩展指令符号扩展指令是指用一个操作数的符号位形成另一个操作数,后一个操作数的各位是全 0( 正数 ) 或全 1( 负数 ),符号扩展指令虽然使数据位数加长,但数据的大小并没有改变 。
该指令的执行不影响标志位 。
( 1) 字节转换为字指令 CBW
该指令的功能是将 AL中的符号位 D7扩展到 AH中 。
( 2) 字转换为双字指令 CWD
该指令的功能是将 AX中的符号位扩展到 DX中 。
38
第 3章指令系统与汇编语言程序设计
6,十进制调整指令十进制数在计算机中是采用二进制数来表示的,
这就是 BCD码,要对十进制的 BCD码进行算术运算,
必须对得到的结果进行调整,否则结果无意义 。
8086指令系统提供了以下两类十进制调整指令 。
( 1) 组合 BCD码加法,减法调整指令
DAA ;组合 BCD码加法调整指令,将 AL中的和调整为组合 BCD码
DAS ;组合 BCD码减法调整指令,将 AL中的差调整为组合 BCD码
39
第 3章指令系统与汇编语言程序设计
( 2) 非组合 BCD加法,减法调整指令
AAA ;非组合 BCD加法调整指令,将 AL中的和调整为非组合
BCD码
AAS ;非组合 BCD减法调整指令,将 AL中的差调整为非组合
BCD码
AAA和 AAS分别用于加法指令 ( ADD,ADC) 或减法指令
( SUB,SBB) 之后,执行时对 AL进行测试,若 AL中的低四位
> 09H,或 AF= 1,则进行 AL← ( AL) ± 06H修正; AL的高 4位为 0,同时 AH← ( AH) ± 1; CF= AF= 1。 调整后的结果放在
AX中
40
第 3章指令系统与汇编语言程序设计
3.3.3 逻辑运算与移位类指令
1,逻辑运算指令有以下 5条逻辑运算指令,它们可对 8位或 16位操作数按位进行逻辑运算 。
( 1) 逻辑与指令,AND dst,src
( 2) 逻辑或指令,OR dst,src
( 3) 逻辑异或指令,XOR dst,src
( 4) 逻辑非指令,NOT dst
( 5) 测试指令,TEST dst,src
。
41
第 3章指令系统与汇编语言程序设计
2,移位指令移位操作类指令可以对字节或字数据中的各位进行算术移位,逻辑移位或循环移位 。
移位指令的格式为,SHL/SAL/SHR/SAR dst,1/ CL
循环移位指令的格式为,ROL/ ROR/ RCL/ RCR dst,1/ CL
上述指令分别对操作数进行逻辑左移 SHL,算术左移 SAL、
逻辑右移 SHR,算术右移 SAR;循环左移 ROL,循环右移 ROR、
带进位的循环左移 RCL,带进位的循环右移 RCR等操作 。 操作数可以是字节或字操作 。
图 3- 7为各种移位操作的功能示意 。
42
CF M
算术右移 SAR
CF M
逻辑右移 SHR
0
CF M
算术左移 SAL
0
CF M
逻辑左移 SHL
0
CF
带进位循环右移 RCR
CF
带进位循环左移 RCL
CF
循环右移 ROR
CF
循环左移 ROL
( 注,CF 为进位位,M 为符号位 )
图 3-7 移位指令的操作功能示意
43
第 3章指令系统与汇编语言程序设计
3.3.4 串操作类指令数据串是存储器中的一串字节或字的数据序列 。
8086指令系统中设置了串操作指令,其操作对象是内存中地址连续的字节串或字串 。 在每次操作后能够自动修改地址指针,为下一次操作作准备 。
基本串操作指令有串传送 ( MOVS),串比较
( CMPS),串扫描 ( SCAS),串存取 ( LODS、
STOS) 等 。 任何一个基本串操作指令的前面都可以加一个重复操作前缀,使指令操作重复,这样在处理长数据串时要比用循环程序速度快得多 。
44
第 3章指令系统与汇编语言程序设计
3.3.5 控制转移类指令程序的执行一般是按指令顺序逐条执行的,但有时需要改变程序的执行流程 。 控制转移类指令就是用来改变程序执行的方向,也就是修改 IP和 CS的值 。 通过控制转移指令可实现各种结构化程序设计,如分支结构程序,循环结构程序等 。
( 1) 如果指令给出改变 IP中内容的信息,转移的目标位置和转移指令在同一个代码段,则称为段内转移;
( 2) 如果指令给出改变 IP中内容的信息,又给出改变 CS中内容的信息,转移的目标位置和转移指令不在同一个代码段,
则称为段间转移 。
根据转移指令的功能,可分为无条件转移指令,条件转移指令,循环控制指令,子程序调用和返回指令 4类 。
45
第 3章指令系统与汇编语言程序设计
1,无条件转移指令无条件转移指令 JMP用来控制程序转移到指定的位置去执行,指令中要给出转移位置的目标地址,通常有以下 5种形式:
JMP SHORT opr ;段内直接短转移
JMP NEAR PTR opr ;段内直接近转移
JMP WORD PTR opr ;段内间接转移
JMP FAR PTR opr ;段间直接转移
JMP DWORD PTR opr ;段间间接转移
46
第 3章指令系统与汇编语言程序设计
2,条件转移指令条件转移指令是根据上一条指令所设置的条件码来测试,
被测试的内容为状态标志位 。 满足测试条件则转移到指令中指定的位置去执行,如果不满足条件则顺序执行下一条指令 。
条件转移指令根据判断的标志位不同,通常可以归纳为 3
类:即判断单个标志位状态,比较无符号数高低和比较带符号数大小 。 这 3类指令在使用之前,应该有比较 CMP,测试
TEST,加减或逻辑运算等指令 。
47
第 3章指令系统与汇编语言程序设计
3,循环控制指令将一段代码程序执行多次操作即为循环,采用循环控制指令实现 。 循环控制转向的目的地址是在以当前 IP内容为中心的- 128~+ 127的范围内,指令采用 CX作为计数器,每执行一次循环,CX内容减 1,直到为零后循环结束 。
( 1) 循环控制指令 LOOP
( 2) 为零或相等时循环控制指令 LOOPZ/LOOPE
( 3) 不为零或不相等时循环控制指令 LOOPNZ/LOOPNE
48
第 3章指令系统与汇编语言程序设计
4,子程序调用和返回指令
( 1) 子程序调用指令指令格式为,CALL NEAR PTR opr ;段内调用
CALL FAR PTR opr ;段间调用
( 2) 子程序返回指令 RET
指令格式,RET
或 RET 表达式
49
第 3章指令系统与汇编语言程序设计
3.3.6 处理器控制类指令这类指令主要用于修改状态标志位,控制 CPU的功能如使
CPU暂停,等待,空操作等 。
50
第 3章指令系统与汇编语言程序设计
3.4 Pentium微处理器新增指令和寻址方式
3.4.1 Pentium微处理器寻址方式
1,Pentium微处理器的内部寄存器和指令格式由于 Pentium微处理器采用 32位指令,它的内部寄存器和指令格式与 16位微处理器存在不同,主要有以下几方面:
( 1) 指令的操作数可以是 8位,16位或 32位;
( 2) 根据指令的不同操作数字段可以是 0~ 3个;
( 3) 在部分不存放结果的单操作数指令中,可以采用立即数作为操作数;
51
第 3章指令系统与汇编语言程序设计
( 4) 部分指令对操作数的数据类型不是简单地要求一致,而是要有不同的匹配关系;
( 5)立即数寻址方式中,操作数可以是 32位的立即数,寄存器寻址方式中,操作数可以是 32位通用寄存器;
( 6) 存储器操作数寻址方式中,操作数可达 32位,寻址方式既可采用 16位的地址寻址方式也可采用 32位的扩展地址寻址方式 。
( 7) 16位微处理器原有的 4个通用数据寄存器扩展为 32位,
更名为 EAX,EBX,ECX和 EDX;
( 8) 原有的 4个用于内存寻址的通用地址寄存器同样扩展为
32位,更名为 ESI,EDI,EBP,ESP;
52
第 3章指令系统与汇编语言程序设计
( 9) 指令指针寄存器扩展为 32位,更名为 EIP;
( 10) 在原有的 4个段寄存器基础上,增加了 2个新的段寄存器 FS和 GS;;
( 11) 32位微处理器增加了 4个系统地址寄存器;
( 12) 标志寄存器也扩展为 32位,更名为 EFLAGS,除了原有的状态,控制标志外,还增加了 2位;
( 13) 新增加了 5个 32位的控制寄存器,命名为 CR0~CR4;
( 14) 新增了 8个用于调试的寄存器 DR0~DR7,2个用于测试的寄存器 TR6~TR7。
53
第 3章指令系统与汇编语言程序设计
2,Pentium微处理器的新增寻址方式如前所述,8086微处理器有固定寻址,立即数寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,
基址变址寻址和相对基址变址寻址等 8种寻址方式,而 Pentium
微处理器有 11种寻址方式 。 与 8086相比新增加的 3种寻址方式分别是比例变址寻址方式,基址加比例变址寻址方式和带位移量的比例变址寻址方式 。
54
第 3章指令系统与汇编语言程序设计
3.4.2 Pentium系列微处理器专用指令
Pentium系列处理器的指令集是向上兼容的,它保留了
8086和 80X86微处理器系列的所有指令,因此,所有早期的软件可直接在奔腾机上运行 。
Pentium处理器指令集中新增加了以下 3条专用指令 。
1,比较和交换 8字节数据指令 CMPXCHG8B
2,CPU标识指令 CPUID
3,读时间标记计数器指令 RDTSC
55
第 3章指令系统与汇编语言程序设计
3.4.3 Pentium系列微处理器控制指令
Pentium处理器指令集中新增加了 3条系统控制指令 。
1,读专用模式寄存器指令 RDMSR
2,写专用模式寄存器指令 WRMSR
3,恢复系统管理模式指令 RSM
56
第 3章指令系统与汇编语言程序设计
3.5 汇编语言简述计算机可直接识别的是机器指令,用机器指令编写的程序称为机器语言程序 。 由于机器指令是用二进制编码来表示的,既不直观又难以记忆,所以使得机器指令编写的程序在使用上受到了限制 。 为了解决机器语言使用上的不便,人们开始使用容易记忆和识别的符号指令来编写程序 。 汇编语言就是用与操作功能含义相应的缩写英文字符组成的符号指令作为编程用的语言 。
57
第 3章指令系统与汇编语言程序设计使用汇编语言编写的程序计算机是不能够直接地识别和执行的,必须经过,翻译,,将汇编语言程序,翻译,成机器语言程序,这个,翻译,是由汇编程序来完成的 。 汇编程序是系统预先提供的系统软件之一,它把源文件转换成二进制编码表示的目标文件 (,OBJ),这个过程称为汇编 。 在汇编过程中对源程序进行语法检查 ( 又称扫描 ),得到无语法错误的结果后,还要经过连接程序,使目标程序成为计算机的可执行文件 (,EXE) 。
58
汇编语言源程序 经汇编程序转换为目标文件 经连接程序转换成可执行文件汇编语言程序转换成为计算机可运行的程序的过程如图 3-8所示。
图 3-8汇编语言程序的执行过程
59
第 3章指令系统与汇编语言程序设计
3.5.1 汇编语言语句的类型和格式汇编语言源程序是由指令,伪指令及宏指令组成的 。 每条指令又可称为一条语句,汇编语言程序中一条完整的语句格式由以下 4项内容组成:
[ name] operation operand [ ; comment]
( 1) 名字项 name:名字通常为一符号序列,表示本条语句的符号地址 。 名字项可用作标号和变量,作为标号表示的是符号地址,其后跟冒号,,,;作为变量表示的是一个数据,
其后不跟冒号,,,。
60
第 3章指令系统与汇编语言程序设计标号和变量具备以下 3种属性:
段属性:该属性定义了标号和变量的段起始地址,其值必须在一个段寄存器中 。 标号的段是它所出现的对应代码段,
由 CS指示 。 变量的段通常由 DS或者 ES指示 。
偏移属性:该属性表示标号和变量相距段起始地址的字节数,该数是一个 16位无符号数 。
类型属性:该属性对于标号而言,用于指出该标号是在本段内引用还是在其他段中引用 。 标号的类型有 NEAR( 段内引用 ) 和 FAR( 段间引用 ) 。 对于变量,其类型属性说明变量有几个字节长度,这一属性由定义变量的伪指令确定 。
61
第 3章指令系统与汇编语言程序设计
( 2) 操作码项 operation:为操作码助记符,可以是指令,
伪指令及宏指令名 。 汇编程序可以将指令翻译成对应的机器码;伪指令是在汇编过程中完成相应的控制操作,又称为汇编控制指令;宏指令是采用有限的一组指令来定义的代号,
汇编时将展开成相应的具体操作指令 。
( 3) 操作数项 operand:为操作码提供数据及操作信息,操作数项可以是常数,变量,表达式等数据,也可以是操作数的地址或地址表达式 。 当有两个或两个以上的操作数时,各操作数之间要用逗号隔开 。
62
第 3章指令系统与汇编语言程序设计
( 4) 注释项 comment:为语句注释,说明所在语句行的功能,以,;,开头,是语句的非执行部分 。 通常,注释用来说明一段程序或几条语句的功能,一段完整的程序注释是很重要的,它可使程序思路显得更清楚,特别是在模块化程序设计中可通过注释将各模块的功能描述出来,大大增强了程序的可读性 。
此外,语句格式中带方括号,[ ],的部分表示任选项,
可根据需要加以选择,汇编语言要求上面的 4项内容之间必须留有空格,否则会被认为是错误的命令 。
63
第 3章指令系统与汇编语言程序设计汇编语言的标识符,表达式和运算符
( 1) 标识符:如前所述,汇编语言语句格式第一个字段是它的名字项,名字可以是标号或变量,这两者又称为标识符 。
标号和变量可以用 LABLE和 EQU伪指令来定义,相同的标号或变量的定义在同一程序中只能允许出现一次 。
( 2) 表达式和运算符:表达式中的运算符充当着重要的角色 。 8086宏汇编有算术运算符,逻辑运算符,关系运算符,
分析运算符和综合运算符共 5种 。
64
第 3章指令系统与汇编语言程序设计
算术运算符用于完成算术运算,加,减,乘,除运算都是整数运算,除法运算得到的是商的整数部分,求余运算是指两数整除后所得到的余数 。
逻辑运算符对操作数进行按位操作,运算后产生一个逻辑运算值,供给指令操作数使用,不影响标志位 。 NOT是单操作数运算符,其它 3个为双操作数运算符 。
关系运算符的运算对象是两个性质相同的项目,其结果只能是两种情况:
关系成立或不成立 。 当关系成立时,运算结果为 1,否则为 0。
分析运算符用于对存储器地址进行运算,它可以将存储器地址的段,偏移量和类型属性分离出来,返回到所在的位置作操作数使用 。 故又称为数值返回运算符 。
综合运算符用来建立和临时改变变量或标号的类型以及存储器操作数的存储单元类型,也称为属性修改运算符 。
65
第 3章指令系统与汇编语言程序设计
3.5.2 汇编语言的源程序结构一个汇编语言源程序包含了以下几个结构形式:
( 1) 汇编源程序一般应该由 3个逻辑段组成,即数据段,堆栈段和代码段 。 数据段用来在内存中建立一个适当容量的工作区,以存放常数,变量等程序需要对其进行操作的数据;
堆栈段用来在内存中建立一个适当的堆栈区,以便在中断,
子程序调用时使用;代码段包括了许多以符号表示的指令,
以完成程序规定的操作 。
( 2) 每个逻辑段以 SEGMENT语句开始,以 ENDS语句结束,整个源程序以 END语句结束,每个逻辑段内有若干条语句以完成某种特定操作功能 。
66
第 3章指令系统与汇编语言程序设计
( 3) 汇编源程序的主模块要用 ASSUME伪指令告诉汇编程序,各个段地址与段寄存器之间的对应关系,以便对源程序模块进行汇编时确定段中各项的偏移量; DOS的装入程序在执行时,将把 CS初始化为正确的代码段地址,把 SS初始化为正确的堆栈段地址,在源程序中不需要再对它们进行初始化 。
由于装入程序已经将 DS寄存器留作它用,所以在源程序中要对 DS进行初始化 。
( 4) 汇编语言源程序存放在存储器中,无论是取指令还是存取操作数,都要访问内存 。 所以,程序的编写必须分段进行,以满足存储器分段管理的要求 。
67
第 3章指令系统与汇编语言程序设计
3.5.3 伪指令我们前面所分析的大都是机器指令,这是 CPU指令系统中提供的命令,在运行时由 CPU执行,每条指令对应 CPU的一种特定的操作,例如传送,加,减法等,经汇编以后,每条 CPU
指令产生一一对应的目标代码 。 而伪指令是用来对相关语句进行定义和说明的,它不产生目标代码,所以又称伪操作 。
宏汇编程序 MASM提供了约几十种伪指令,主要有数据定义,符号定义,段定义,过程定义,模块定义,结构等 。
68
第 3章指令系统与汇编语言程序设计
1,数据定义伪指令数据定义伪指令用来定义变量的类型,给变量分配存储单元 。
数据定义伪指令的一般格式为:
[变量名 ] 伪指令 数据项 [;注释 ]
数据定义伪指令 有以下 5种形式:
( 1) DB( Define Byte),定义字节变量,每个数据占 1个字节 。
( 2) DW( Define Word),定义字变量,每个数据占 1个字,即 2个字节 。
( 3) DD( Define Double word),定义双字变量,每个数据占 2个字,即
4个字节 。
( 4) DQ( Define Quadruple word),定义 4字变量,每个数据占 4个字,
即 8个字节 。
( 5) DT( Define Ten byte),定义 10字节变量,每个数据占 10个字节 。
69
第 3章指令系统与汇编语言程序设计
2,符号定义伪指令符号定义伪指令主要是为程序中的表达式赋予一个符号名,或定义新的类型属性等 。 它为程序的编写和使用带来了许多方便 。
( 1) EQU( 等值 ) 伪指令:将表达式的值或符号赋予 EQU前面的一个名字,
可以用这个名字来代替给定的表达式 。 需要注意的是,一个符号一经 EQU
伪指令赋值后,在整个程序中不允许再对同一符号重新赋值 。
( 2) = ( 等号 ) 伪指令:其功能与 EQU伪指令基本相同,主要区别在于它可以对同一个名字重复定义 。
( 3) LABLE( 标号 ) 伪指令:其用途是在原来标号或变量的基础上定义一个类型不同的新的标号或变量 。
( 4) PTR( 属性修改 ) 伪指令:用于临时指定或修改操作数的类型属性 。
70
第 3章指令系统与汇编语言程序设计
3,段定义伪指令段定义伪指令可对代码段,数据段,堆栈段及附加段进行定义和赋名,并指明段的定位类型,组合类型及类别 。 代码段的内容主要是指令及伪指令,数据段,堆栈段及附加段主要是定义数据,分配存储单元等 。
有以下两种段定义伪指令:
( 1) SEGMENT/ENDS伪指令格式,段名 [定位类型 ] [组合类型 ] [‘类别 ’ ]
… ( 段内语句系列 )
段名 ENDS
71
第 3章指令系统与汇编语言程序设计
( 2) ASSUME伪指令格式:
ASSUME 段寄存器名:段名 [,段寄存器名:段名 [,… ]]
ASSUME段寻址伪指令放置在代码段的开始处,可以设定多个段与段寄存器之间的对应关系,中间用逗号分开 。 当汇编程序汇编一个逻辑段时,可利用相应的段寄存器寻址该逻辑段中的指令或数据 。
72
第 3章指令系统与汇编语言程序设计
4,过程定义伪指令汇编语言中的子程序是以过程的形式出现的,过程的调用和返回采用 CALL和 RET指令来完成 。 过程定义伪指令的格式如下:
格式:过程名 PROC [NEAR]/FAR
… ( 过程中的语句系列 )
RET
… ( 过程中的语句系列 )
过程名 ENDP
73
第 3章指令系统与汇编语言程序设计
5,结构定义伪指令结构是将逻辑上相互关联的一组数据以某种形式组合在一起,形成一个整体以便进行数据处理 。 结构的使用需要经过结构定义,结构预置和结构引用等过程 。
结构采用伪指令 STRUC和 ENDS进行定义,把相关数据定义语句组合起来,便构成一个完整的结构 。 其格式如下:
结构名 STRUC
… ( 数据定义语句序列 )
结构名 ENDS
74
第 3章指令系统与汇编语言程序设计
6,模块定义伪指令一个较大的汇编语言源程序,按任务分配可以由多个模块组成,每个模块都是具有独立功能的逻辑单位 。 为了实现模块之间的连接,调用,
相互访问,变量传送等功能,通常使用以下几个伪指令 。
( 1) NAME伪指令:用于给源程序汇编以后得到的目标程序指定模块名,
在汇编连接时使用 。
( 2) END伪指令:表示源程序结束,指示汇编程序停止汇编,END后面的语句可以不予理会 。
( 3) PUBLIC伪指令:用于定义本模块中的某些符号是全局符号名,允许程序中的其它模块直接引用 。
( 4) EXTRN伪指令:指明本模块中所用的某些符号在程序的其它模块中已经定义,且出现在其它模块的 PUBLIC伪指令中 。
75
第 3章指令系统与汇编语言程序设计
7,定位伪指令 ORG和程序计数器 $
( 1) ORG伪指令,ORG是起始位置设定伪指令,用来指定某条语句或某个变量的偏移地址 。 在程序设计中,如果需要将存储单元分配在指定位置,可以使用 ORG伪指令来改变位置计数器的值 。
( 2) 程序计数器 $:字符,$”出现在在程序中的表达式里,
它的值为程序下一个所能分配的存储单元的偏移地址,称为程序计数器 。,$”用来表示位置计数器的当前值 。
76
第 3章指令系统与汇编语言程序设计
3.5.4 宏指令与高级汇编技术在汇编语言中,有的程序段需要多次重复使用,为了减少编程的工作量,可将它们定义为一条宏指令 。 需要时,直接在程序中将宏指令当作一条指令一样来引用 。
汇编程序在源程序的汇编过程中,将宏指令对应的程序段目标代码嵌入到该宏指令处 。 宏指令实际上也是一种伪指令,
比起前面介绍的伪指令功能更强,使用更灵活,在源程序中采用宏指令可简化程序 。
77
第 3章指令系统与汇编语言程序设计
1,宏汇编所谓,宏,是指源程序中一段具有独立功能的代码,宏指令代表一段源程序 。 当宏汇编时,宏指令就被自动地展开成为相应的机器码而插入源程序中的宏调用处,宏调用指令在汇编过程中对宏定义体作宏展开操作 。 宏展开就是用宏定义体取代源程序中的宏指令名,并用实参取代宏定义中的形参,而且要求实参要与形参一一对应 。
宏定义语句格式是:
宏指令名 MACRO [形参 1,形参 2,…,形参 n]
…… ;宏体
ENDM
78
第 3章指令系统与汇编语言程序设计
( 2) 宏调用:经定义的宏指令,可以在源程序中调用,称为宏调用 。 宏调用的格式为:
宏指令名 [实参 1,实参 2,…,实参 n]
( 3) 宏展开:宏展开就是将宏指令语句用宏定义中宏体的程序段目标代码替换 。 在汇编源程序时,宏汇编程序将对每条宏指令语句进行宏展开,取调用提供的实参替代相应的形参,对原有宏体目标代码作相应改变 。
79
第 3章指令系统与汇编语言程序设计
2,重复汇编在编写汇编程序的过程中,有时需要重复编写相同或几乎完全相同的一组代码,为避免重复编写的麻烦,可以使用重复汇编 。
重复汇编伪指令有以下 3种:
( 1) 定重复伪指令 REPT/ENDM,REPT和 ENDM必须成对出现,两者间之的重复内容是要重复汇编的部分,重复汇编次数用表达式的值来表示 。
( 2) 不定重复伪指令 IRP/ENDM:此伪指令重复执行重复内容中所包含的语句,重复的次数由参数表中的参数个数决定 。
( 3) 不定重复字符伪指令 IRPC/ENDM:此伪指令重复执行重复内容中的语句,重复汇编的次数等于字符串中字符的个数 。
80
第 3章指令系统与汇编语言程序设计
3.
条件汇编也是汇编语言提供的一组伪操作 。 伪操作指令中指出汇编程序所进行测试的条件,汇编程序将根据测试的结果有选择地对源程序中的语句进行汇编处理 。
条件伪操作的一般格式:
IF 〈 表达式 〉
[ 条件程序块 1]
[ ELSE]
[ 条件程序块 2]
ENDIF
81
第 3章指令系统与汇编语言程序设计
3.5.5 汇编语言程序上机过程
1,汇编语言的工作环境帮助建立汇编语言源程序和支持汇编语言程序运行的软件主要包括以下几个方面:
( 1) DOS操作系统:汇编语言源程序的建立和运行都是在 DOS操作系统的支持下进行的 。
( 2) 编辑程序:是用来输入和建立汇编语言源程序的一种通用的系统软件,源程序的修改也可在编辑状态进行 。
( 3) 汇编程序:一般选用宏汇编 MASM.EXE,将源程序汇编成目标程序 。
( 4) 连接程序,8086汇编语言使用的连接程序是 LINK.EXE。
( 5) 调试程序:作为一种辅助工具来帮助编程者进行程序的调试,常采用动态调试程序 DEBUG.COM。
82
第 3章指令系统与汇编语言程序设计
2,汇编语言上机步骤通常,在计算机上运行汇编语言程序的步骤主要有以下几方面:
( 1) 用编辑程序 ( 例如 EDIT.COM) 建立扩展名为,ASM的汇编语言源程序文件;
( 2) 用汇编程序 ( 例如 MASM.EXE) 将源程序文件汇编成用机器码表示的目标程序文件,其扩展名为,OBJ;
( 3) 用连接程序 ( 例如 LINK.EXE) 把目标文件转化成可执行文件,其扩展名为,EXE。 如果在汇编过程中出现语法错误,根据错误的信息提示 ( 如错误位置,错误类型,错误说明 ),用编辑软件重新调入源程序进行修改 。
( 4) 生成可执行文件后,在 DOS命令状态下直接键入文件名就可执行该文件 。
83
第 3章指令系统与汇编语言程序设计
3.6 基本程序设计程序设计的目的是把解决实际问题的方法转化为计算机程序 。 在汇编程序设计过程中,首先对要解决的问题进行具体的描述,对于较小的程序可以使用程序流程图,对于较大的程序可以采用模块化程序设计方法 。 无论采用流程图还是模块化的方法设计都要使用程序设计的基本程序结构来表现出来,基本的程序结构包括顺序结构,分支结构,循环结构及子程序结构 。
84
第 3章指令系统与汇编语言程序设计
3.6.1 程序设计的步骤和程序的基本结构
1.程序设计的基本步骤用汇编语言设计程序,一般按下述步骤进行:
( 1) 分析问题,抽象出数学模型
( 2) 确定算法或解题思想
( 3) 绘制流程图
( 4) 程序编制
( 5) 程序的运行,检查与调试
85
第 3章指令系统与汇编语言程序设计
2,程序的基本结构程序的基本结构通常可以分为顺序结构,分支结构和循环结构 3种 。 每一个结构只有一个入口和一个出口,3种结构的有机组合和嵌套可构成结构化程序 。
( 1) 顺序结构:该结构是按照语句的先后次序执行一系列的顺序操作,
没有分支和跳转 。
( 2) 分支结构:也叫条件选择结构,可根据不同情况做出判断和选择,
以便执行不同的程序段 。 分为双分支结构和多分支结构 。
( 3) 循环结构:循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的 。 按照条件判断的位置,可以把循环分为,当型循环,和,直到型循环,
86
第 3章指令系统与汇编语言程序设计
3.6.2 顺序结构程序设计顺序结构是一种最简单的程序设计结构形式 。 采用这种结构只能完成简单的任务程序设计 。 顺序结构在任何结构的程序中都会出现,因此,它是构成复杂程序的基础 。
【 例 3.32】 用顺序结构来编程实现求 S=( X2+ Y2) /Z的值,将最后结果放入 RESULT单元保存 。
本题中要定义 4个变量,X,Y,Z是计算表达式涉及到的数据,RESULT单元是结果的存放单元 。 为方便数据的重复使用,采用寄存器来存放中间结果 X2和 Y2。
87
参考程序如下:
DATA SEGMENT ;定义数据段
X DB 5 ;给 X,Y,Z赋初值
Y DB 7
Z DB 2
RESULT DB? ;定义 RESULT单元,预留空间
DATA ENDS ;数据段结束
CODE SEGMENT ;定义代码段
ASSSUME CS,CODE,DS,DATA
START,MOV AX,DATA ;初始化 DS
MOV DS,AX
MOV AL,X ;将数据 X送 AL
MUL X ;计算 X2
MOV BX,AX ;将中间结果保存到 BX
MOV AL,Y ;将数据 Y送 AL
MUL Y ;计算 Y2
ADD AX,BX ; X2+Y2,结果保存到 AX
DIV Z ;计算 ( X2+ Y2) /Z
MOV RESULT,AL ;最后结果送 RESULT单元
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS ;代码段结束
END START ;汇编结束
88
第 3章指令系统与汇编语言程序设计
3.6.3 分支结构程序设计在解决某些实际问题时,采用的方法会随着某些条件的不同而不同,这种在不同条件下处理的程序称为分支程序,
采用分支结构设计的程序结构上清晰,易于阅读及调试 。
程序中所产生的分支是由条件转移指令来完成的 。 汇编语言提供了多种条件转移指令,可以根据使用不同的转移指令所产生的结果状态选择要转移的程序段,对给定问题进行处理 。
89
第 3章指令系统与汇编语言程序设计
1,单分支程序设计单分支结构是分支程序中最简单的一种形式,由它可组成其它复杂程序的基本结构 。 程序设计时要明确需要判断的条件,并选择合适的条件转移语句 。
【 例 3.33】 编程实现将键盘输入的小写字母转换为大写字母显示出来 。
从键盘接收数据后,在程序内要判断接收的是否是小写字母,是则进行转换,否则不予转换,这样就需要判断所输入字符是否在 ‘ a’和 ‘ z’的范围内,采用单分支结构即可实现 。
转换后结果的显示通过 DOS功能调用的 02号功能,将要显示字符的
ASCII码放在 DL中 。
90
参考程序如下:
CODE SEGMENT
ASSUME CS,CODE
START,MOV AL,01H ;采用 DOS调用的 01号功能,从键盘输入字符
INT 21H
CMP AL,‘ a’ ;与字符 ‘ a’进行比较
JB EXIT ;小于 ‘ a’,转向结束
CMP AL,‘ z’ ;与字符 ‘ z’进行比较
JA EXIT ;大于 ‘ z’,转向结束
SUB AL,20H ;大小写字母间相差 20H
MOV DL,AL ;转换后,结果送 DL
MOV AH,02H ; DOS调用 02号功能,显示结果
INT 21H
EXIT,MOV AH,4CH ;返回 DOS
INT 21H
CODE END ;代码段结束
END START ;汇编结束
91
第 3章指令系统与汇编语言程序设计
2,多分支程序设计当程序中需要根据不同判断条件进行多项操作时,就要用到多路分支结构形式 。
【 例 3.34】 编写程序,完成下面的分段函数的计算,给定 X为带符号的字节数据 。
1 X> 0
Y= 0 X= 0
- 1 X< 0
这是 3路分支的程序设计,根据题目要求 X为内存中的一个带符号数 。
采用两重条件判断:首先判断 X值的正负,若为负数,将- 1送到 Y中保存;
若为正数,再判断 X是否为 0,如果为 0,将 0送到 Y中保存,否则将 1送到 Y
中保存 。
92
程序设计如下:
DATA SEGMENT
X DB -10
Y DB?
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA
MOV DS,AX ;初始化 DS
MOV AL,X ; X取到 AL中
CMP AL,0 ; AL和 0比较
JGE BIG ; ≥ 0,转 BIG
MOV BL,-1 ;否则 -1送 BL
JMP EXIT ;转到结束位置
BIG,JE MIN ; AL=0转 MIN
MOV BL,1 ;否则 1送 BL
JMP EXIT ;转到结束位置
MIN,MOV BL,0 ; 0送 BL
EXIT,MOV Y,BL ; BL中内容送 Y
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS ;代码段结束
END START ;汇编结束
93
第 3章指令系统与汇编语言程序设计
3.6.4 循环结构程序设计
1,循环程序的基本结构使用循环结构的形式设计程序时,通常将循环程序划分为 4
( 1) 初始化部分:对循环程序的初始状态进行设置 。
( 2) 循环体:是完成循环工作的主要部分,要重复执行这段操作 。
( 3) 参数修改部分:为保证每次循环的正常执行,计数器值,操作数地址指针等相关信息要发生有规律的变化,为下一次循环作准备 。
( 4) 循环控制部分:每个循环程序必须选择一个恰当的循环控制条件来控制循环的运行和结束 。 如果循环次数已知可使用计数器来控制,如果循环次数未知应根据具体情况设置控制循环结束的条件 。
94
第 3章指令系统与汇编语言程序设计
2,单重循环程序设计此种情况下,在程序中只需要一个循环过程即可完成规定的操作 。
【 例 3.35】 设计一个程序来完成求 1~100的累加和,结果送到
SUM单元中 。
该题目的循环次数是已知的,可以采用计数控制的方法 。
程序中用递增计数法来实现求累加和 。
95
程序设计如下:
DATASEGMENT
SUM DW? ;预留结果单元
CN EQU 100 ;计数终止值
DATA ENDS
CODE SEGMENT
ASSUME DS,DATA,CS,CODE
START,MOV AX,DATA ;初始化 DS
MOV DS,AX
MOV AX,0 ;累加器清零
MOV CX,1 ;置循环计数初始值
LP,ADD AX,CX ;求累加和
INC CX ;计数器加 1
CMP CX,CN ; CX和终止值比较
JBE LP ;小于等于终止值,转循环入口处 LP
MOV SUM,AX ;超过计数终止值,结果送 SUM单元
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS
END START ;汇编结束
96
第 3章指令系统与汇编语言程序设计
3,多重循环程序设计如果在一个循环体中又出现另一个循环操作即为多重循环程序,也称为循环嵌套 。 使用多重循环时要注意以下几个问题:
( 1) 内循环必须完整地包含在外循环中,循环可以嵌套和并列,但内外循环不能相互交叉;
( 2) 可以从内循环直接跳到外循环,但不能从外循环直接跳到内循环;
( 3) 无论是内循环还是外循环,都不要使循环回到初始化部分,否则将出现死循环;
( 4) 每次完成外循环再次进入内循环时,初始条件必须重新设置 。
97
第 3章指令系统与汇编语言程序设计
【 例 3.36】 在内存 BUF单元开始的区域中存放有一组无符号的字节数据,试编程序将这些数据按从小到大的顺序排序,
排序后的数据依然放在原来的存储区中 。
采用冒泡法来设计程序 。 设从地址 BUF开始的内存缓冲区中有 N个元素组成的字节数组,按照从小到大的次序排列:
将第一个存储单元中的数与其后 N-1个存储单元中的数逐一进行比较,如果数据的排列次序符合要求,不做任何操作;
否则两数交换位置 。 经过第一轮的 N- 1次比较,N个数据中的最小数放到了第一个存储单元中 。
98
第 3章指令系统与汇编语言程序设计第二轮处理时,将第二个存储单元中的数据与其后的 N-
2个存储单元中的数据逐一比较,每次比较后都把小数放到第二个存储单元中,经过 N-2次比较后,N个数据中的第二个小数存入了第二个存储单元 。
依次类推,做同样的操作,当最后两个存储单元中的数据比较完毕后,就完成了 N个数据从小到大的排序 。
99
程序设计如下:
DATA SEGMENT
BUF DB 23H,09H,14H,53H,67H,89H,4FH,20H,A5H,10H
CN EQU $-BUF
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA ;初始化 DS
MOV DS,AX
MOV CX,CN-1 ;外循环次数送计数器 CX
LP1,MOV SI,0 ;数组起始下标 0送 SI
PUSH CX ;外循环计数器入栈
LP2,MOV AL,BUF [SI] ; BUF [SI]取出送 AL
CMP AL,BUF [SI+1] ; BUF [SI]和 BUF [SI+1]比较
JLE NEXT ;小于或等于转 NEXT
XCHG AL,BUF[SI+1] ;否则 BUF [SI]和 BUF [SI+1]交换
MOV BUF [SI],AL
NEXT,INC SI ;数组下标加 1
LOOP LP2 ; CX-1不为 0转 LP2
POP CX ;否则退出内循环,将 CX出栈
LOOP LP1 ; CX-1不为 0转 LP1
MOV AH,4CH ;返回 DOS
INT 21H
CODE ENDS
END START ;汇编结束
100
第 3章指令系统与汇编语言程序设计
3.6.5 子程序设计在计算机的应用系统中,经常把一些常用的具有一定功能的程序段进行标准化,单独存放在某一存储区域中,需要执行的时候,再使用专门指令调用,这种程序段就称为子程序 。 在汇编语言中,子程序又称为过程,调用子程序的程序段称为主程序,主程序中 CALL指令的下一条指令的地址称为返回地址 。
程序采用子程序结构具有以下优点:
( 1) 可以简化程序设计过程,大量节省程序设计时间 。
( 2) 可缩短程序的长度,节省汇编时间和程序的存储空间 。
( 3) 增加了程序的可读性,便于对程序进行修改和调试 。
( 4) 为程序的模块化,结构化和自顶向下的设计提供了方便 。
101
1,子程序的调用下面说明子程序的基本结构和主 -子程序之间的调用关系 。
【 例 3.37】 采用主程序调用 子程序的结构形式,完成 N个数据的累加和计算 。 该 N个数据为字节型数据,存放在开始地址为 ADRR的内存单元 。
主程序段如下:
MAIN PROC FAR ;主程序开始
START,PUSH DS ;保护现场
MOV AX,0 ;累加器清零
PUSH AX ; AX内容入栈
CALL SUBP ;调用过程 SUBP
RET ;返回
MAIN ENDP ;主程序定义结束子程序段如下:
SUBP PROC ;子程序开始
MOV AX,DATA ;初始化 DS
MOV AX,DS
LEA SI,ADRR ;取数据的有效地址
MOV CX,N ;取数据个数
NEXT,ADD AL,[SI] ;数据累加
ADC AH,0 ;带进位加
INC SI ;地址加 1
LOOP NEXT ;循环控制
RET ;返回主程序
SUBP ENDP ;子程序定义结束
102
第 3章指令系统与汇编语言程序设计从本例可以看出主 -子程序的基本结构包括以下几个部分:
( 1) 主 -子程序说明:用来说明主 -子程序的名称,功能,入口参数,出口参数,占用工作单元的情况,明确调用方法 。
( 2) 现场保护及恢复:通常主程序已经占用了一定的寄存器,
子程序执行时也会用到相关寄存器,为了保证主程序按原有状态继续正常执行,需要对这些寄存器的内容加以保护 。 此外,子程序执行完毕后要恢复这些被保护的寄存器的内容 。
现场保护及恢复通常采用堆栈操作 。
( 3) 子程序体:这一部分内容用来实现相应的子程序功能 。
( 4) 子程序返回:返回语句 RET和调用语句 CALL是相互对应的 。
103
第 3章指令系统与汇编语言程序设计
2,子程序的参数传递主程序在调用子程序之前,必须把需要加工处理的数据传递给子程序,这些被加工处理的数据称为输入参数;当子程序执行完毕返回主程序时,应把本次加工处理的结果传递给主程序,这些结果称为输出参数 。 我们把主程序向子程序传递输入参数以及子程序向主程序传递输出参数称为主程序和子程序间的参数传递 。
汇编语言中实现参数传递的方法主要有 3种:
( 1) 寄存器传递
( 2) 堆栈传递
( 3) 存储器传递
104
第 3章指令系统与汇编语言程序设计
3.7 系统功能调用磁盘操作系统 DOS( Disk Operating System) 是 PC机上最重要的操作系统,DOS功能调用可完成对文件,设备,内存的管理 。 对用户来说,这些功能模块就是几十个独立的中断服务程序,这些程序的入口地址已由系统置入中断向量表中,
在汇编语言程序中可用中断指令直接调用 。 DOS模块提供了更多更必要的测试,使 DOS操作更简易,而且对硬件的依赖性更少 。
105
第 3章指令系统与汇编语言程序设计
8086存储器系统 8K的 ROM中存放有基本输入输出系统
BIOS( Basic Input/Output System,) 例行程序 。 BIOS给 PC
系列的不同微处理器提供了兼容的系统加电自检,引导装入,
主要 I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断 。 使用 BIOS功能调用,给程序员编程带来极大方便 。 程序员不必了解硬件的具体细节,可直接使用指令设置参数,并中断调用 BIOS例行程序,所以利用 BIOS功能调用编写的程序简洁,可读性好,而且易于移植 。
106
第 3章指令系统与汇编语言程序设计
DOS与 BIOS功能都是通过软件中断来调用的 。 在中断调用前需要把功能号装入 AH寄存器,把子功能号装入 AL寄存器,
除此之外,还需要在 CPU的寄存器中提供专门的调用参数 。
一般来说,调用 DOS或 BIOS功能时,有以下几个步骤:
( 1) 将调用参数装入指定的寄存器 。
( 2) 如需功能调用号,把它装入 AH。
( 3) 如需子功能调用号,把它装入 AL。
( 4) 按中断号调用 DOS或 BIOS。
( 5) 检查返回参数是否正确 。
107
第 3章指令系统与汇编语言程序设计
3.7.1 DOS功能调用
1,系统功能调用的方法要完成 DOS系统的功能调用,按如下基本步骤操作:
( 1) 将入口参数送到指定寄存器中;
( 2) 子程序功能号送入 AH寄存器中;
( 3) 使用 INT 21H指令转入子程序入口执行相应操作 。
108
第 3章指令系统与汇编语言程序设计
2,常用的几种系统功能调用
( 1) AH= 01H;带显示的键盘输入
( 2) AH= 02H;从显示器上输出单个字符
( 3) AH= 05H;从打印机上输出单个字符
( 4) AH= 07H;不带显示的键盘输入,对 Ctrl+Break组合键无反应
( 5) AH= 08H;不带显示的键盘输入,对 Ctrl+Break组合键有反应
( 6) AH= 09H;在显示器上输出字符串
( 7) AH= 0AH;将字符串输入到内存缓冲区
( 8) AH= 4CH;程序退出并返回 DOS
109
第 3章指令系统与汇编语言程序设计
3.7.2 BIOS中断调用
BIOS为用户程序和系统程序提供主要外设的控制功能,
如系统加电自检,引导装入及对键盘,磁盘,磁带,显示器,
打印机,异步串行通信口等的控制 。 计算机系统软件就是利用这些基本的设备驱动程序,完成各种功能操作 。 每个功能模块的入口地址都在中断矢量表中,通过中断指令 INT n可以直接调用 。 n是中断类型号,每个类型号 n对应一种 I/O设备的中断调用,每个中断调用又以功能号来区分其控制功能 。
110
第 3章指令系统与汇编语言程序设计常用的 BIOS中断调用主要有:
( 1) INT 10H;显示器输出中断调用
( 2) INT 13H;低级磁盘输入输出中断调用
( 3) INT 14H;串行通信口输入输出中断调用
( 4) INT 16H;键盘输入中断调用
( 4) INT 17H;打印机输出中断调
( 5) INT 1AH;实时时钟服务中断调用有关 BIOS中断调用的类型号、功能、入口参数和出口参数可参见附录。
111
第 3章小结本章小结
8086指令系统和寻址方式是汇编语言程序设计的基础,
应该熟练掌握其具体内容、特点和应用场合。 8086CPU指令按操作数类别可分为隐含操作数指令、单操作数指令和双操作数指令 3种;按操作数的存放位置可以分为立即数、寄存器操作数、存储器操作数和 I/O端口操作数 4种类型。为了获得操作数的存放位置,就要对其寻址,寻找操作数地址的方式称为寻址方式。 8086有立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址等方式。要熟悉各种寻址方式的特点和区别,尤其要掌握存储器寻址方式中的有效地址 EA和物理地址 PA的计算方法。
指令系统与汇编语言程序设计
112
第 3章小结
8086CPU指令系统按功能可分为数据传送类、算术运算类、逻辑运算类、串操作类、控制转移类、
处理器控制类等指令。状态标志是 CPU进行条件判断和控制程序执行流程的依据,大多数指令的执行不影响标志位,某些指令的执行会按照规则影响标志位,还有一些指令会按特定方式影响标志位,在实际应用中要特别注意。应该正确理解和运用各种指令的格式、功能和注意事项来为程序设计服务。
指令系统与汇编语言程序设计
113
第 3章汇编语言程序设计有 4种基本的程序结构和设计方法 。 顺序结构是按照语句的先后次序执行一系列的操作,是最简单的一种结构 。 分支结构是程序设计中常用的结构之一,它有双分支和多分支两种形式 。 循环结构用来实现需要重复执行的操作,通常由循环初始化,循环处理部分,循环修改部分和循环控制部分 4部分组成 。 另外,汇编语言可以充分利用和发挥计算机硬件的特性与优势,因此成为编写高性能软件最有效的程序设计语言 。
本章还简要介绍了 DOS系统功能调用和 BIOS中断调用的使用方法,对键盘,显示器,打印机等设备的输入 /输出方法是经常使用的,今后如果用到系统中断调用的其它功能可以查看有关资料 。
指令系统与汇编语言程序设计
114
第 3章内容到此结束谢谢各位 !