




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章8086/8088汇编语言程序设计7.1引言7.2顺序程序设计7.3分支结构程序设计7.4循环结构程序设计7.5字符串操作程序设计
7.6宏、条件汇编与重复汇编
7.7子程序设计7.88086/8088微处理器的其他指令与应用
2025/2/251.汇编语言的基本概念汇编语言是一种面向机器(处理器)的程序设计语言,是机器语言的符号化表示。汇编语言的执行语句与机器指令有着一一对应的关系,即一个执行语句对应一条机器指令。按照某种机器汇编语言的语法规则编写的源程序必须翻译成相应的机器语言才能在计算机上运行。这个翻译过程称为汇编。从汇编语言到机器语言的翻译程序叫汇编程序.7.1引言2025/2/252.学习汇编语言的重要性
学习汇编语言有助于加深对计算机组成、寻址方式和指令集的理解。使用汇编语言可以直接操作、控制计算机的底层硬件。相对于高级语言源程序经过编译得到的目标程序,汇编语言源程序经汇编得到的目标程序具有代码精练、占用存储空间小、执行速度快的特点,甚至还可以降低机器的功耗。学会一种汇编语言(8086/8088汇编语言),就可以轻松自学其他的汇编语言(如ARM)。7.1引言2025/2/253.8086/8088汇编语言的基本语法
合法的字符英文字母A~Z/a~z(汇编语言不区分字母大小写)数字0~9符号+、–、*、/、=、<、>、(、)、[、]、;、,、
、:、’、”、_、@、$、&、#、?、!7.1引言2025/2/253.8086/8088汇编语言的基本语法
数据分为常量和变量在汇编期间,常量的值完全确定。在程序运行期间,常量的值不会发生变化。在汇编语言中,变量名代表的是该变量在计算机中的存储地址(和类型)。
7.1引言2025/2/253.8086/8088汇编语言的基本语法
常量二进制整数,例如:01010101B
八进制整数,例如:567O、567Q十进制整数,例如:1234十六进制整数,例如:12H,0ABH字符,例如:‘O’、“GOOD”十进制实数,例如:12.34E–5
十六进制实数,例如:1A2B345R
7.1引言2025/2/253.8086/8088汇编语言的基本语法
符号常量用途:提高程序的可读性、降低发生错误的可能性通过“EQU”或“=”语句来定义例如:PIEQU3.141592ALPHT=PI*3一个符号用“EQU”定义后就不允许对其再次定义,而用“=”定义的符号可以对其再次定义符号常量及其数值保存在汇编程序管理的符号表中,在汇编过程中,一旦遇到符号就用它的数值替换。7.1引言2025/2/253.8086/8088汇编语言的基本语法
变量两种类型:寄存器变量和主存变量寄存器变量就是寄存器名。例如:AX(AH|AL),BX(BH|BL),CX(CH|CL),DX(DH|DL),SI,DI,BP,SP,CS,DS,ES,SS,IP主存变量简称为变量.变量名具有段地址、偏移地址和类型三个属性。变量的类型有:DB、DW、DD、DQ和DT。7.1引言2025/2/25一个实现字节型变量X+Y
Z的源程序汇编语言源程序,在结构上与高级语言源程序是相似的,都是先定义变量,再编写对变量进行处理的语句。汇编语言的语句是计算机指令的助记符,功能单一,一行只能书写一个语句/指令,且用“回车”来标志结束,不需要在语句末尾加任何标点符号。著名诗人艾青:诗是艺术的语言——最高的语言,最纯粹的语言。您认不认为:编汇编语言程序就想写诗一样?
2025/2/25一个实现字节型变量X+Y
Z的源程序注释处理语句(也称指令性语句)说明语句(也称伪指令性)2025/2/253.8086/8088汇编语言的基本语法
上例的伪指令有段定义伪指令、变量定义伪指令和段值设置伪指令段定义伪指令由语句“段名SEGMENT”开始,以语句“段名ENDS”结束。变量定义伪指令的格式是:变量名变量类型变量初值序列[;注释]段值设置伪指令ASSUME,放在代码段的开始处
ASSUME
CS:CODE,DS:DATA
7.1引言2025/2/25ASSUME伪指令仅仅告诉汇编程序:段寄存器与程序段的对应关系。段地址的真正设定还需要由指令性语句对段寄存器赋值来完成。不过代码段的段寄存器CS的赋值由DOS的装入模块自动完成,所以程序只需对数据段的段寄存器DS或附加数据段的段寄存器ES赋值。
MOVAX,DATA;数据段DATA的段地址送入AX
MOVDS,AX
;AX中的内容送入数据段段寄存器DS2025/2/25可见,一个段到底是数据段还是代码段与其名字无关,取决于程序把哪个段对应到哪个段寄存器。所以当源程序有多个段时,要小心编程,以免出错。2025/2/253.8086/8088汇编语言的基本语法
上例的指令性语句有MOV指令、ADD指令和INT指令指令性语句的一般格式是:
[标号:]指令操作符[操作数][,操作数][;注释]操作数分为源操作数和目的操作数,前者表示欲处理数据的源地址,后者表示处理结果的存储地址,两者的数据类型必须一致。标号是后面紧跟着冒号的标识符,代表冒号后面语句的存储地址,供转移指令或循环指令作为操作数使用标号的属性:NEAR、FAR7.1引言2025/2/253.8086/8088汇编语言的基本语法
标号、段名和变量名统称为标识符是一个由字母、符号或数字组成的字符串。字符串的限制:(1)必须采用合法的字符;(2)第一个字符必须是字母、问号、@或下划线中的一个,不能是数字;(3)不能使用汇编语言的保留字。标识符中字符个数没有明确的限制,但只有前面的31个字符能够被汇编程序识别。标识符的命名应该有一些含义,以增强程序的可读性和可理解性。7.1引言2025/2/253.8086/8088汇编语言的基本语法
MOV指令格式:MOVDst,Src;(Dst)
(Src)
例如:MOVAX,
BXMOVCX,1234HMOV可实现通用寄存器和主存单元之间的数据传送,却不能实现两个主存单元之间或两个段寄存器之间的数据传送。7.1引言2025/2/253.8086/8088汇编语言的基本语法
ADD指令格式:ADDDst,Src;(Dst)
(Src)+(Dst)
例如:ADDAX,
BXADDCX,[1234H]ADD指令影响标志位OF,SF,ZF,AF,PF,CF7.1引言2025/2/25汇编语言程序的开发过程编写源程序:EDIT(DOS),
TextPad(Windows)将源程序保存为XXXX.asm
文件使用MASM生成目标程序XXXX.obj使用LINK生成可执行程序XXXX.exe7.1引言源程序XXX.asm目标程序XXX.obj可执行程序XXX.exe设计编辑用MASM汇编用LINK连接执行2025/2/251.概述顺序程序是指不含有转移指令或分支指令的程序,语句执行的顺序就是它们排列的顺序。
7.2顺序程序设计2025/2/257.2顺序程序设计指令格式:XORDst,Src;(Dst)
(Src)
(Dst)注意对标志位的影响。2025/2/252.寻址方式
目的大多数情况下,指令不直接给出操作数本身,而是给出存放操作数的寄存器或者是内存单元的地址。大多数情况下,操作数地址也不是直接给出,而是给出计算操作数地址的方法,称之为寻址方式7.2顺序程序设计2025/2/25(1)立即寻址操作数作为指令的一部分存放在指令中,位于操作码之后,这种操作数称为立即数。立即数可以是8位的或者16位的。(386之后的机器也可以是32位的)立即数用来表示常数,它经常用来给寄存器赋初值。只能用于源操作数字段,不能用于目的操作数字段,且源操作数长度应与目的操作数长度一致。2025/2/25立即数寻址举例
MOVAX,3064H
指令执行后(AX)=3064H6430……………………OP…………指令AX2025/2/25立即寻址举例MOV AL,4EH4EOP4EMOVAL,4EHAL2025/2/25(2)寄存器寻址操作数在寄存器中,指令中指定寄存器号。16位的操作数,寄存器可以是
AX,BX,CX,DX,SI,DI,SP,BP。8位的操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH,DL。2025/2/25例:MOVAX,BX
指令执行前:(AX)=3064H
(BX)=1234H指令执行后:(AX)=1234H
(BX)=1234H寄存器寻址不需要访问存储器来取得操作数,所以可以得到较高的运算速度。2025/2/25立即数寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址不需要计算操作数的地址需要计算操作数的
有效地址EA2025/2/25操作数的地址段地址偏移地址+我们把这个偏移地址称为有效地址(EA)有效地址=基址+变址+位移量存放在指令中的一个8位、16位的数,但它不是立即数,而是一个地址。存放在变址寄存器(SI,DI)中的内容,用来访问数组中的某个元素或字符串中的某个字符存放在基址寄存器(BX,BP)中的内容,它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址2025/2/25段偏移地址CSIPSSSP或BPDSBX、DI、SI或一个16位数ESBX、DI、SI或一个16位数8086/8088段寄存器和相应存放偏移地址的寄存器之间的默认组合2025/2/25(3)直接寻址操作数的有效地址只包含位移量一种成分,其值就存放在代码段中指令的操作码之后。位移量的值就是操作数的有效地址。例:MOVAX,[2000H]
假设(DS)=3000H物理地址=3000H*16+2000H
=32000H32000H0020……………………OP…………代码段5030…………数据段AX
则指令执行后,AX=3050H2025/2/25可以用符号来代替数值地址
MOVAX,ADDR
MOVAX,[ADDR]
如果在附加段,则应指定段前缀
MOVAX,ES:ADDR
MOVAX,ES:[ADDR]
直接寻址中操作数地址是直接写在指令中,所以它只适用于处理单个变量。因为要处理另外一个变量,就需要用另外一条指令了。2025/2/25(4)寄存器间接寻址指令的操作数是一个寄存器。但是寄存器中的内容并不是真正的操作数,而是操作数的有效地址。因此真正的操作数需要按照这个有效地址访问主存储器才能获得。16位寻址,可用的寄存器是BX,BP,SI,DI。使用BX、SI、DI,其默认段是数据段DS。使用BP,其默认段是堆栈段SS。2025/2/25例:MOVAX,[BX]设(DS)=2000H
(BX)=1000H物理地址=2000H*16+1000H=21000H指令执行后AX=50A0H21000H……………………A050…………数据段AX寄存器间接寻址可用于以循环结构来处理表格,执行完一条指令后,只需修改寄存器内容就可以用同一个指令来访问表格的下一项。2025/2/25(5)寄存器相对寻址“相对寻址”意味着指令中带有位移量。操作数的有效地址为基址寄存器或变址寄存器的内容和指令中的位移量之和。
例:MOVAX,COUNT[SI]也可以表示为MOVAX,[COUNT+SI]请问:寄存器间接寻址与寄存器相对寻址,有何不同?2025/2/25例:MOVAX,COUNT[BX]
MOVAX,COUNT[SI]
当指令中使用的是基址寄存器BX或BP时,也称为基址寻址。当指令中使用的是变址寄存器SI或DI时,也称为变址寻址。2025/2/25例:MOVAX,COUNT[BX]设(DS)=3000H
(BX)=2000HCOUNT=3000H物理地址=3000H*16+2000H+3000H=35000H指令执行后AX=1234H30000H35000H0030……………………OP…………代码段3412…………数据段AX…………33000HCOUNTBXDS2025/2/25寄存器相对寻址(即基址寻址或变址寻址)
同样可以用于以循环结构来处理表格,表格的首地址可设置为偏移量(第几列)的地址,利用修改基址或变址寄存器中的内容(第几行)来取得表格中的值。2025/2/25(6)基址变址寻址操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和例:MOVAX,[BX][DI]也可以表示为MOVAX,[BX+DI]2025/2/25指令执行后
AX=1234H21000H221FDH……………………3412…………数据段AX…………21158HBX例:MOVAX,[BX][DI]设(DS)=2100H
(BX)=0158H
(DI)=10A5H物理地址=(2100H*16+0158H)+10A5H
=21158H+10A5H=221FDH2025/2/25基址变址寻址同样可以用于以循环结构来处理数组或表格。表格的首地址可存放在基址寄存器中(在处理过程中保持不变),利用变址寄存器的值作为下标来访问数组或表格中的元素,每处理完一个元素,变址寄存器的值“加一”指向下一个元素。2025/2/25(7)相对基址变址寻址“相对寻址”意味着指令中带有位移量。操作数的有效地址是一个基址寄存器与一个变址寄存器的内容和指令中的位移量之和。例:MOVAX,ARRAY[BX][SI]也可表示为MOVAX,[ARRAY+BX+SI]2025/2/25例:MOVAX,MASK[BX][SI]设(DS)=3000H
(BX)=2000H
(SI)=1000HMASK=0250H物理地址=3000H*16+2000H+1000H+0250H
=33250H假设[33250]=1234H,则指令执行后
AX=1234H2025/2/25相对基址变址寻址常用于二维数组元素的寻址。如存储器中存放着由多个记录组成的文件,则以位移量可以指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素2025/2/253.表达式的使用
例7-232位数据X和Y的加减,结果分别存于Result1和Result2。DATASEGMENTXDD12345600HYDD11223344HResult1DD?Result2DD?DATAENDS
7.2顺序程序设计2025/2/25代码段的框架CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
(核心代码)MOVAH,4CHINT21HCODEENDSENDSTART7.2顺序程序设计2025/2/25代码段的核心代码MOVAX,WORDPTRX
MOVDX,WORDPTR[X+2] ;把1234H装入DXADDAX,WORDPTRYADCDX,WORDPTR[Y+2] ;MOVWORDPTRResult1,AX ;保存结果的低16位
MOVWORDPTR[Result1+2],DX ;保存结果的高16位
MOVAX,WORDPTRXMOVDX,WORDPTR[X+2]SUBAX,WORDPTRYSBBDX,WORDPTR[Y+2];MOVWORDPTRResult2,AXMOVWORDPTR[Result2+2],DX7.2顺序程序设计带进位的加法带借位的减法表达式2025/2/25表达式的类型:数值表达式:
常量与运算符(包括圆括号)组成的算式,它的运算结果被当作一个数值地址表达式:
运算对象,包括寄存器名、常量、变量、标号及方括号(表示读主存)与运算符组成的算式,它的运算结果被当作一个主存地址
7.2顺序程序设计2025/2/25数值表达式的运算符类型:算术运算符+(加)、–(减)、*(乘)、/(除)、MOD(取余数)、SHR(算术右移)和SHL(算术左移)。其中算术右移/左移1位相当于除以/乘以2。7.2顺序程序设计2025/2/25数值表达式的运算符类型:逻辑运算符。AND(与)、OR(或)、NOT(非)和XOR(异或)。关系运算符。EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)和GE(大于等于)。它们的运算结果是0(表示不成立或者“假”)或0FFFFH(表示成立或者“真”)。7.2顺序程序设计2025/2/25数值表达式的例子:MOVBX,((SUMLT10)AND30)OR((SUMGE100)AND20符号常量SUM小于10时,将被汇编成“MOVBX,30”;SUM大于等于100时,将被汇编成“MOVBX,20”;SUM介于10~100时,将被汇编成“MOVBX,0”。
7.2顺序程序设计2025/2/25地址表达式的运算符类型:数值表达式中的三类运算符属性取代符类型运算符PTR段地址取代符“:”短地址取代符SHORT任意类型运算符THIS属性分离符7.2顺序程序设计2025/2/25地址表达式的运算符类型(续):属性分离符取段地址符SEG和取偏移地址符OFFSET取类型符TYPE元素个数属性符LENGTH字节总数属性符SIZE高位字节属性符HIGH和低位字节属性符LOW
7.2顺序程序设计2025/2/254.乘/除法运算的实现(1)8086/8088的乘法指令有两个:无符号数乘法指令MUL(unsignedMULtiple)MULsrc
;(AX)
(AL)*(8位src)(DX,AX)
(AX)*(16位src)
带符号数乘法指令IMUL(sIgned
MULtiple)IMULsrc
;(AX)
(AL)*(8位src)(DX,AX)
(AX)*(16位src)7.2顺序程序设计2025/2/254.乘/除法运算的实现(2)8086/8088的除法指令有两个:无符号数除法指令DIV(unsignedDIVide)
DIVsrc
;(AL)
(AX)/(8位src)的商,
(AH)
(AX)/(8位src)的余数
(AX)
(DX,AX)/(16位src)的商
(DX)
(DX,AX)/(16位src)的余数
带符号数除法指令IDIV(sIgned
DIVide)
IDIVsrc
;(同上)7.2顺序程序设计2025/2/255.算术移位与逻辑移位(1)8086/8088的算术移位指令有两个:算术左移指令SAL(ShiftArithmeticLeft)
SALopr,1SALopr,CL
算术右移指令SAR(ShiftArithmeticRight)
SARopr,1SARopr,CL
7.2顺序程序设计2025/2/255.算术移位与逻辑移位(2)8086/8088的逻辑移位指令有两个:逻辑左移指令SHL(SHiftlogicalLeft)SHLopr,1SHLopr,CL
逻辑右移指令SHR(SHiftlogicalRight)
SHRopr,1SHRopr,CL
7.2顺序程序设计2025/2/25程序的分支是通过转移指令来实现的。8086/8088微处理器提供了两类转移指令:无条件转移指令JMP条件转移指令JX。它们的执行均不影响标志位。7.3分支结构程序设计2025/2/251.无条件转移指令JMP指令格式:JMPOPR指令功能:根据操作数OPR,更改IP或CS。根据是否改变CS寄存器,无条件转移可以分为段内转移:不改变CS,只改变IP;段间转移:既改变CS,又改变IP。
7.3分支结构程序设计2025/2/251.无条件转移指令JMP7.3分支结构程序设计2025/2/25段内转移的三种形式:段内直接短转移。其格式是:JMPSHORTOPR段内直接近转移。其格式是:JMPOPR段内间接转移。其格式是:JMPWORDPTROPR段内直接转移
以当前IP指向的地址为基准地址,加上跟在操作码后面的相对位移量D,得到目标指令的有效地址EA。 为了便于实现加法,相对位移量D以补码的形式表示位移量DIP+EA2025/2/25段内直接转移
8位的相对位移量(类型为:SHORT),对应的转移范围是:-128~+127
16位的相对位移量(类型为:NEAR),对应的转移范围是:-32768~+32767
例如:JMPNEARADDRJZSHORTADDR
位移量是汇编程序通过求转向的目标指令的有效地址与当前IP值之差而的。注意:当前IP已经指向转移指令的下一条指令2025/2/25段内间接转移转向的有效地址是一个寄存器或是一个存储单元的内容。这个寄存器或者存储单元中的内容可以用除立即数以外的任何一种寻址方式获得
(IP)
(EA)2025/2/25假设:(DS)=2000H,(BX)=1256H,
(21256H)=3280H.
JMPBX
执行该指令后,(IP)=1256H
JMP[BX]
执行该指令后,(IP)=(20000H+1256H)=(21256H)
=3280H寄存器寻址方式寄存器间接寻址方式2025/2/25假设:(DS)=2000H,(BX)=1256H,(SI)=528FH
,位移量VAR=2011H
(23267)=3280H,(284F6H)=2450H
JMPVAR[BX]
执行该指令后,(IP)=((DS)*16+(BX)+位移量)
=(20000H+1256H+2011H)
=(23267H)=3280H
JMPVAR[BX][SI]
(IP)=((DS)*16+(BX)+(SI)+VAR)
=(20000H+1256H+528FH+2011H)
=(284F6H)=2450H基址变址相对寻址方式寄存器相对寻址方式2025/2/25
段间转移应用于转移目标不在JMP指令所在段的场合,需要给出4字节的目标地址CS:IP。段间转移有两种形式:
段间直接(远)转移:JMPFARPTROPR指令直接提供转向的段地址和偏移地址(类型为:FARPTR),例如:JMPFAR
PTROPR
(IP)
OPR的低16位(段内偏移地址)(CS)
OPR的高16位(段地址)2025/2/25段间直接(远)转移段间间接寻址用存储器中的相邻两个字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。存储单元的有效地址EA是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式获得完成的操作:(IP)(EA)(CS)(EA+2)2025/2/25例JMPDWORDPTR[BX+8]
(BX)=3706H,(DS)=1000HEA=(BX)+8=3706H+8=370EH物理地址=(DS)*16+EA=10000H+370EH=1370EH
………B2H67H05H33H………………1370EH指令执行后,(IP)=67B2H,(CS)=3305H2025/2/252.条件转移指令JX和比较指令CMPJX
的格式是:JXOPR,其中OPR是目的地址标号(SHORT属性)。JX
的操作是:满足条件则(IP)
(IP)+OPR,即跳转到目的地址处执行指令;否则不做任何操作(即IP不变,执行下一条指令)。说明:X
为1~3个字母,表示转移条件。为了得到条件转移指令所需的条件,通常需要先执行“比较”指令CMP(CoMPare)
7.3分支结构程序设计2025/2/25判断单个标志位状态的条件转移指令有10条:CF=1时转移JC(JumpifCarry)。CF=0时转移JNC(JumpifNotCarry)。ZF=1时转移JE/JZ(JumpifEqual,orZero)。ZF=0时转移
JNE/JNZ(JumpifNotEqual,orNotZero)SF=1时转移JS(JumpifSign)。SF=0时转移JNS(JumpifNotSign)。OF=1时转移JO(JumpifOverflow)。OF=0时转移
JNO(JumpifNotOverflow)。PF=1时转移JP/JPE(JumpifParity,orParityEven)。PF=0时转移JNP/JPO(JumpifNotParity,orParityOdd)7.3分支结构程序设计2025/2/25比较无符号数的条件转移指令有4条:高于/不低于且不等于(CF=0且ZF=0)转移JA/JNBE。高于或等于/不低于(CF=0或ZF=1)转移JAE/JNB。低于/不高于且不等于(CF=1且ZF=0)转移JB/JNAE。低于或等于/不高于(CF=1或ZF=1)转移
JBE/JNA。其中,A
表示高于(Above),B
表示低于(Below),
E
表示等于(Equal)。
7.3分支结构程序设计2025/2/25比较有符号数的条件转移指令有4条:大于/不小于且不等于(ZF=0且SF
OF=0)转移JG/JNLE。大于或等于/不小于(ZF=1或SF
OF=0)转移JGE/JNL。小于/不大于且不等于(ZF=0且SF
OF=1)转移JL/JNGE。小于或等于/不大于(ZF=1或SF
OF=1)转移JLE/JNG。其中,G
表示大于(Greater),L表示小于(Less),
E表示等于(Egual)。7.3分支结构程序设计2025/2/25例7-4求三个16位无符号数中的最大值DATASEGMENTXDW180Y
DW670ZDW320MAXDW?DATAENDS开始结束X≥Y?X≥Z?MAX←XYYXYXZNN2025/2/25例7-4求三个16位无符号数中的最大值CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
(具体操作指令序列)MOVAH,4CHINT21HCODEENDSENDSTART2025/2/25例7-4求三个16位无符号数中的最大值
(具体操作指令序列)MOVAX,XCMPAX,YJAEAXBIGMOVAX,Y
AXBIG:CMPAX,ZJAEAXMAXMOVAX,ZAXMAX:MOVMAX,AX开始结束X≥Y?X≥Z?MAX←XYYXYXZNN2025/2/25例7-5已知三个带符号的8位二进制数x、y、z,将其按升序排序后重新存回x、y、zDATASEGMENTXDB-5Y
DB23ZDB7DATAENDS结束开始X<Y?YX
YNX<Z?YX
ZNY<Z?YY
ZN2025/2/25例7-5程序主体框架CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(具体操作指令序列)
EXIT:MOVAH,4CHINT21HCODEENDSENDSTART2025/2/25MOVAL,XCMPAL,YJLXLYXCHGAL,YXCHGAL,X
XLY:CMPAL,ZJLCMPYZXCHGAL,ZXCHGAL,XCMPYZ:MOVAL,YCMPAL,ZJLEXITXCHGAL,ZXCHGAL,Y例7-5具体操作指令序列结束开始X<Y?YX
YNX<Z?YX
ZNY<Z?YY
ZN2025/2/25根据是否已知循环次数,可将循环分为计数循环和条件判断循环。计数循环的循环次数是已知的、确定的。一般是将循环次数存入计数寄存器CX,然后每循环1次CX减1,当CX不为0时,循环继续,否则结束循环。这种循环结构常用LOOP指令来实现。LOOP指令的格式是:LOOP语句标号。操作是:CX
(CX)–1。若CX
0则IP
(IP)+语句标号;否则IP不变(即执行LOOP指令的下一条指令)
7.4循环结构程序设计2025/2/25条件判断循环并不关心循环的次数,只关心进入循环的条件是否满足。所以这种循环可以通过条件转移指令或下列条件循环指令来实现。8086/8088的条件循环指令有:为零或相等循环指令LOOPZ/LOOPE(LOOPwhileZero,orEqual)和非零或不相等循环指令LOOPNZ/LOOPNE(LOOPwhileNonZero,orNotEqual)。7.4循环结构程序设计2025/2/25LOOPZ/LOOPE指令的格式是:
LOOPZ/LOOPE
语句标号。操作是:CX
(CX)–1。若CX
0且ZF=1,则IP
(IP)+语句标号;否则IP不变。LOOPNZ/LOOPNE指令的格式是:
LOOPNZ/LOOPNE语句标号。操作是:CX
(CX)–1。若CX
0且ZF=0,则IP
(IP)+语句标号;否则IP不变。7.4循环结构程序设计2025/2/25在汇编后得到的目标代码中,LOOP,LOOPZ/LOOPE和LOOPNZ/LOOPNE指令中的操作数“语句标号”的实质是一个单字节的补码,其值等于循环控制指令与转移目标语句的距离。这些循环控制指令的执行均不影响标志位。
7.4循环结构程序设计2025/2/25例7-6有一个首地址为ARRAY的M字数组,请编程计算该数组内容之和,并把结果存入TOTAL中。程序的数据段DATASEGMENTARRAYDW12,13,26,35,71,83
MEQU($–ARRAY)/2
TOTALDW?DATAENDS
7.4循环结构程序设计2025/2/25
例7-6有一个首地址为ARRAY的M字数组,请编程计算该数组内容之和,并把结果存入TOTAL中。程序代码段的核心代码MOVAX,0MOVCX,M;循环次数M送入CXMOVSI,AX;效果等于“MOVSI,0”,但更快STARE_LOOP:ADDAX,ARRAY[SI]ADDSI,2 ;地址加2指向下一个字型数据
LOOPSTART_LOOPMOVTOTAL,AX7.4循环结构程序设计2025/2/25例7-7将位于数据段TEXT地址中的小写字母,转换成大写字母,然后存回原地址内,TEXT内容结束标志为“$”开始结束BXTEXT的偏移地址AL[BX]AL=‘$’?AL<‘a’?AL>‘z’?AL–20HAL,AL[BX]BX+1BXYYYNNNASCII码中,大于等于‘a’且小于等于‘z’的字母为小写字母,通过减32(20H)可将其转换成大写字母。2025/2/25CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
LEABX,TEXT......EXIT:MOVAH,4CHINT21HCODEENDSENDSSTART2025/2/25B20:MOVAL,[BX]CMPAL,'$';判断是否是“结束符”JEEXIT;是,则结束CMPAL,'a'JB
B30;在‘a’之下,是大写字母CMPAL,'z'JA
B30
;在‘z’之上,不是字母SUBAL,20H;小写字母变大写字母MOV[BX],AL;替换原先小写字母B30:INCBX;指向下一个字母,JMPB202025/2/25例7-8把BLOCK为首地址的数据区中100个连续的8位二进制数按正、负数分开,分别送到两个缓冲区PLUS_DATA(存正数)和MINUS_DATA(存负数)中。假设数据中不存在0。判断正数的算法:使用TEST指令测试符号位,然后判断ZF标志。
TESTAL,10000000B
若为正数,则“与”运算结果为0,ZF=12025/2/25DATASEGMENT
BLOCKDB1,-2,3,-4,...,100
PLUS_DATADB100DUP(?)
MINUS_DATADB100DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX......CODEENDSENDSSTART2025/2/25CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
LEASI,BLOCKLEADI,PLUS_DATALEABX,MINUS_DATAMOVCX,100......CODEENDSENDSSTART2025/2/25GOON:MOVAL,[SI]TESTAL,10000000BJNZMINUS;转去处理负数MOV[DI],AL;处理正数INCDI;下一正数的存储地址JMPAGAINMINUS:MOV[BX],AL;处理负数INCBX;下一负数的存储地址AGAIN:INCSI;指向下一待处理的数据
LOOPGOON;一个完整的循环结构2025/2/25字符串操作指令和重复前缀8086/8088微处理器提供了5条字符串操作指令:传送串指令MOVS(MOVeString)、存回串指令STOS(STOreintoString)、取入串指令LODS(LOAdfromString)、扫描串指令SCAS(SCAnString)和比较串指令CMPS(COMpareString)。它们都是单字节指令,指令执行一次只处理一个字符。要想让指令连续处理一个字符串,可以在指令前面加上“重复前缀”:REP(重复)、REPE/REPZ(相等/为零重复)或REPNE/REPNZ(不相等/不为零重复)。重复的次数由CX中的值决定。7.5字符串操作程序设计2025/2/25字符串操作指令和重复前缀8086/8088微处理器提供了5条字符串操作指令:传送串指令MOVS(MOVeString)、存回串指令STOS(STOreintoString)、取入串指令LODS(LOAdfromString)、扫描串指令SCAS(SCAnString)和比较串指令CMPS(COMpareString)。它们都是单字节指令,指令执行一次只处理一个字符。要想让指令连续处理一个字符串,可以在指令前面加上“重复前缀”:REP(重复)、REPE/REPZ(相等/为零重复)或REPNE/REPNZ(不相等/不为零重复)。重复的次数由CX中的值决定。7.6宏、条件汇编与重复汇编2025/2/257.7子程序设计1.引言如果在一个程序中的多个地方、或多个程序中的多个地方用到了同一段程序,那么可以将这段程序抽取出来,存放在某一存储区域,每当需要执行这段程序时,就调用指令转到这段程序去,执行完毕,再返回原来的程序。把抽取出来的这段程序叫做子程序或过程,调用它的程序称为主程序或调用程序子程序允许嵌套和递归2025/2/25子程序的调用过程记录断点:为了返回到调用程序的合适地方,转子调用必须保留返回调用程序的下一条指令的地址(返回地址)--又叫断点。即当前IP寄存器的值。保护现场:保存有关通用寄存器的内容,子程序返回主程序之前,恢复这些通用寄存器的内容参数传递的方法通过寄存器传递:适于参数较少时通过参数表传递:适合参数较多的情况通过堆栈传递:适合参数较多,且子程序有嵌套、递归的情况2025/2/251.引言2.调用指令和返回指令(1)调用指令:CALL子程序名/目的地址(2)返回指令:RET[n]7.7子程序设计2025/2/25调用指令格式:CALL子程序名/目的地址功能:段内直接近调用CALL子程序名(NEAR)PUSH(IP)(IP)
(IP)+16位的二进制数段内间接近调用CALLWORDPTR[BX][DI]PUSH(IP)(IP)(EA)2025/2/257.7子程序设计段间直接远调用CALL子程序名(FAR)PUSH(CS)PUSH(IP)(IP)目标地址中指定的偏移地址(CS)目标地址指定的段地址段间间接远调用CALLDWORDPTR[BX]PUSH(CS)PUSH(IP)(IP)(EA)(CS)(EA+2)2025/2/25返回指令RET段内近返回(IP)
POP()段间远返回(IP)
POP()(CS)
POP()2025/2/257.7子程序设计子程序设计适合编成子程序的程序一段程序在整个任务中被多次使用一段程序在多个任务中被多次使用子程序的特点节省存储空间增大了时间开销2025/2/257.7子程序设计子程序的组成框架;程序说明BTODPROCFAR(NEAR)
保护现场;将寄存器压入堆栈核心工作
恢复现场;将堆栈弹回寄存器
RET
;返回BTODENDP2025/2/251.引言2.调用指令和返回指令3.子程序的参数传送通过寄存器传送通过堆栈传送通过地址表传送2025/2/257.7子程序设计7.88086/8088微处理器的其他指令与应用1.处理器控制指令清除CF标志CLC进位有效位CF求反CMC置CF标志STC置DF标志STD清除DF标志CLD置IF标志STI清除IF标志CLI处理机暂停HLT等待状态WAIT将数据传送给协处理器ESC保证总线的控制LOCK无操作NOP2025/2/251.处理器控制指令2.对标志位的操作
8086/8088微处理器只提供对标志寄存器中DF(第10位)、IF(第9位)和CF(第0位)三个标志位进行修改的指令,那么如何修改OF(第11位)、TF(第8位)、SF(第7位)、ZF(第6位)、AF(第4位)、PF(第2位)标志位呢?
7.88086/8088微处理器的其他指令与应用2025/2/25利用标志进栈指令PUSHF(PUSHtheFlags)和标志出栈指令POPF(POPtheFlags)指令。例如欲清除TF标志,可以用如下语句:PUSHF ;将标志寄存器的内容压入堆栈MOVBP,SP;栈顶指针送入BP寄存器AND[BP],0FEFFH;将BP指向的主存单元的第8位置成0POPF ;将栈顶单元的内容写入标志寄存器欲翻转OF标志,可以用如下语句:PUSHF;标志位入栈POPAX;标志位入AXXORAX,0800H;在AX中将OF翻转,其余位不变PUSHAX;修改后的标志位入栈POPF ;标志位出栈存回标志寄存器7.88086/8088微处理器的其他指令与应用2025/2/25利用“标志寄存器低字节送AH指令LAHF(LoadAHwithFlags)”和“AH送标志寄存器低字节指令SAHF(StoreAHintoFlags)”。LAHF和SAHF指令都是单字节指令,执行时间都是4个时钟周期,LAHF指令的执行不影响标志位,SAHF指令执行后低8位标志位的值由指令的操作数决定。例如,欲清除SF标志,可以用如下语句:LAHFANDAH,7FH;将标志寄存器的第7位置成0SAHF欲将标志寄存器低8位清0,可以用如下语句:MOVAH,00HSAHF7.88086/8088微处理器的其他指令与应用2025/2/251.处理器控制指令2.对标志位的操作3.中断指令在执行程序的过程中,计算机会遇到一些异常情况或特殊请求。此时处理器将保存当前的状态,转去进行必要的处理,处理完毕后返回到程序间断处继续执行。这个过程叫做中断。中断可分为由处理器外部引起的外部中断、异常情况引起的硬件中断和“中断”指令INT引起的软件中断。
7.88086/8088微处理器的其他指令与应用2025/2/253.中断指令INT指令的格式是:INTTYPE或INT。其中TYPE为中断类型号,它是一个取值范围在0~255之间的常数或常数表达式,例如INT21H。所有中断都有一个编号——中断类型号。类型号
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年花艺师考试的活动执行力试题及答案
- 纤维素纤维复合材料的设计与制造考核试卷
- 残疾人康复医学基础知识考核试卷
- 糕点店市场营销策略与实践考核试卷
- 小型河道拦水堰施工方案
- 笔的制造业市场趋势预测与规划考核试卷
- 2025年证券从业资格证考试多种解法试题及答案
- 箱包企业社会责任实践与报告考核试卷
- 注册会计师考试案例分析技巧与策略试题及答案
- 项目计划的制定与调整考题及答案
- 新版MACSV系统手册
- 智慧养老服务平台建设投标方案(技术方案)
- 2023年贵阳市招考派遣至贵州高级人民法院书记员笔试参考题库(共500题)答案详解版
- 国有企业知识产权管理
- 心理健康教育课件《高三学生心理辅导之跨越高原期》
- 电梯维保服务投标方案
- 《传统纹样》课程标准
- 人教版八年级生物下册期中试卷(含答案)
- C语言程序设计说课(共34张PPT)
- 不审令舒儿科常见问题
- 2022-2023学年浙江省温州二中八年级(下)期中数学试卷(含解析)
评论
0/150
提交评论