的寻址方式和指令系统_第1页
的寻址方式和指令系统_第2页
的寻址方式和指令系统_第3页
的寻址方式和指令系统_第4页
的寻址方式和指令系统_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章8086的寻址方式和指令系统3.18086的寻址方式3.2指令的机器码表示方法3.38086指令系统1汇编语言指令的特点语法结构符合人类语言的共同特点——动作+对象指令操作码→动作:做什么指令操作数→对象:针对什么做动作例: MOVAX,BX机器指令:指令的二进制代码形式。如:89D8汇编指令:助记符形式的指令。如:MOVAX,BX2汇编语言指令操作码:由CPU设计人员定义。每一种操作唯一对应一个操作码。操作数:可由编程人员采用不同方式给出。寻址方式:寻找操作数(操作数地址)的方式;指令格式:指令中对操作码、操作数的编码方式。3操作数1.8086指令中操作数的个数可以有以下几种情况无操作数指令,例:等待指令WAIT单操作数指令,例:加1指令INCAL双操作数指令,例:减法指令

SUBAL,BL源操作数:后者(BL)目的操作数:前者(AL)42、操作数存放地点,可以有以下几种:立即数:操作数直接包含在指令中。 例:MOVAL,50H

寄存器操作数:操作数存放在寄存器中。例:INCAL

I/O操作数:操作数来自I/O端口。例:INAL,28H操作数内存操作数:操作数存放在内存单元中。 例:MOVAL,[2000H]

53.18086的寻址方式6实质都是间接寻址78086的非存储器寻址方式1、立即数寻址方式源操作数以8位或16位常数的形式直接出现在指令中。一般用于赋值。

例:MOVAL,5FH2、寄存器(直接)寻址方式

8位或16位寄存器的值就是操作数本身。与其它寻址方式相比,该方式执行速度最快。

例:MOVSI,DX通用寄存器、段寄存器均可83、固定寻址(隐含寻址)

操作数并不直接出现在指令中,而是由操作码隐含地指定为某一固定内容。例:PUSHDS

;目操作数隐含为栈顶字单元

POPBX

;源操作数隐含为栈顶字单元

LAHF

;源操作数隐含为标志寄存器低字节,;目操作数隐含为寄存器AH4、I/O端口寻址仅用于输入/输出指令IN、OUT。98086的存储器寻址方式二、存储器寻址方式1、直接寻址方式操作数存放在存储器单元中,由指令直接给出该单元的有效地址EA(即16位段内偏移量)。操作数的物理地址PA=16*DS+EA

例:MOVAX,[0016H]寻址过程示意段超越前缀

MOVAX,ES:[0500H]符号地址

MOVAX,AREA1102、寄存器间接寻址方式操作数存放在存储器单元中,指令给出的16位寄存器值就是该单元的EA。

PA=16*DS+BX

或=16*DS+SI

或=16*DS+DI

或=16*SS+BP例:MOV[BX],CL寻址过程示意必须是BX、BP、SI、DI段超越前缀:MOVBX,DS:[BP]MOVAX,ES:[SI]113、寄存器相对寻址操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和。例:MOVDL,[BP+2]寻址过程示意其它等效写法

MOVDL,[BP]2MOVDL,2[BP]124、基址变址寻址方式操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和。

PA=16*DS+BX+

PA=16*SS+BP+

例:MOV[BX][SI],AX寻址过程示意其它等效写法:

MOV[BX+SI],AXSIDI135、相对基址变址寻址方式操作数的有效地址是一个基址寄存器和一个变址寄存器的内容,再加上指令中指定的8位或16位位移量之和。

PA=16*DS+BX++位移量或

PA=16*SS+BP++位移量例:MOVAX,4[BX][DI

寻址过程示意其它等效写法:

MOVAX,4[BX+DI]MOVAX,[BX+DI+4]SIDI14段寄存器使用规则直接寻址使用BX、SI、DI的间接寻址使用BP的间接寻址堆栈操作源串指针目标串指针指令指针默认段寄存器DSDSSSSSDSESCS可加的段超越前缀ES:SS:CS:ES:SS:CS:DS:ES:CS:—ES:SS:CS:——固定搭配的寄存器SPDIIP153.28086的指令格式与编码指令的书写格式

操作码[[操作数1],[操作数2]]说明:操作码:必备;操作数:可以是1个、2个或没有,可以是8位或16位指令的编码格式采用变长编码格式,属于CISC。低端

高端指令前缀操作码字段寻址方式字段操作数字段1字节1字节1字节1~4字节便于书写可读性强163.38086指令系统3.3.1数据传送指令3.3.2算术运算指令3.3.3逻辑运算及移位指令3.3.4串操作指令3.3.5控制转移指令3.3.6处理器控制指令3.3.7指令的执行时间和软件延时173.3.1数据传送指令通用数据传送指令MOV堆栈操作指令PUSH、POP数据交换指令XCHG查表指令XLAT输入输出指令IN、OUT地址传送指令LEA、LDS、LES标志传送指令LAHF、SAHF、PUSHF、POPF小结18通用数据传送指令MOV功能:将源操作数内容复制到目的操作数中格式:MOVdst,src;(dst)←(src)Dst:R、M、SR;Src:R、M、SR、Im不影响标志位19MOV指令有以下5种传送路径:①立即数→通用寄存器或存储单元MOVAX,0220HMOVWORDPTR[DI],1000H②通用寄存器←→通用寄存器MOVAL,BL;BL中的8位数据送到AL中③通用寄存器←→段寄存器MOVDS,AX;AX中的16位数据送到DSMOVBX,ES;ES中的16位数据送到AX20④通用寄存器←→存储单元MOV4[DI],AL;((DI)+4)←ALMOVAX,[SI];AX←((SI))⑤段寄存器←→存储单元MOV[BX+SI],CS;CS的内容送到[BX+SI]和[BX+SI]+1的两单元MOVDS,[3000H];3000H和3001H两单元的内容送到DS其它操作:传递偏移地址

MOVDX,OFFSETARRAY;将ARRAY的偏移地址送至DX,offset是属性操作符21特别注意MOV指令不能直达的路径:立即数×→段寄存器存储单元×→存储单元段寄存器×→段寄存器CS段寄存器不可作为目的操作数22对MOV指令的使用,应注意以下几点:

MOV指令是双操作数指令,源和目的操作数的类型必须一致,或同为字节,或同为字。下面的指令是错误的:

MOVAX,BLMOVAL,1234H

不允许用立即数作目的操作数。不能用CS和IP作目的操作数,也就是说,CS

和IP两寄存器的内容不得随意改变,一般只能在转移指令时改变。23堆栈的概念

堆栈——以“先进后出”原则组织起来的连续的存储空间。

堆栈操作以字为单位。固定以SS:SP为指针指示栈顶,出、入堆栈的操作均针对栈顶单元进行。80X86的堆栈生长方向为“由高向低增长”。入栈,指针减出栈,指针加24堆栈操作入栈:先修改栈顶指针(SP减2);然后将入栈数据存入,低字节存入SP指向的单元,高字节存入SP+1指向的单元。出栈:先将出栈数据弹出,SP指向的单元存入目标位置低字节,SP+1指向的单元存入目标位置高字节;然后修改栈顶指针(SP加2)。25堆栈操作指令1、入栈指令PUSH可使用的操作数类型:PUSHCX ;通用寄存器PUSHDS ;段寄存器PUSH[0040H];存储器

目操作数隐含为栈顶单元指令执行时先SP减2入栈过程示意2、出栈指令POP可使用的操作数类型:POPSI ;通用寄存器POPES ;段寄存器POP[BX] ;存储器源操作数隐含为栈顶单元指令执行后SP加2出栈过程示意不能用CS!不影响标志位26数据交换指令XCHG功能:将源、目操作数的内容互相交换,指令执行后源、目操作数同时被改变指令形式:XCHGop1,op2;(op1)(op2)op1:R,M;op2:R,M不影响标志位交换指令对操作数有如下要求:两个操作数字长必须相同,可以是字节交换,也可以是字交换。27源操作数和目的操作数均可以是寄存器或存储器,但不能同时为存储器。

段寄存器不能作为操作数。如:

XCHGCL,DH ;通用寄存器通用寄存器

XCHGAX,[BP];通用寄存器存储器寄存器存储器【例】

设(DS)=2000H,(SI)=0100H,

(DX)=1145H,(20300H)=22H,(20301H)=3CH则执行指令“XCHG[SI+200H],DL”后,DL的内容发生了什么样的变化?

28查表指令XLAT指令功能:将AL中的值(码)转换为内存表格中的某一值后,再送回AL中。指令形式:XLAT[数据表首地址标号]应用举例TABDB0,1,4,9,16,25,36,49,64,81 ;数据段中以TAB为首地址定义的字节表,数目≤255……MOVBX,OFFSETTABMOVAL,4XLATTAB指令执行后,AL=16。实现什么功能?29已知十进制数0~9的七段LED显示码对照表如表所示。试用XLAT指令求数字6的七段显示码。十进制数的七段显示码

十进制数字七段显示码十进制数字七段显示码0123440H79H24H30H19H5678912H02H78H00H18H30TABLEDB40H,79H,24H,30H,19HDB12H,02H,78H,00H,18H┆┆MOVAL,6;数字6的位移量送ALMOVBX,OFFSETTABLE;表格首址送BXXLATTABLE

31输入/输出指令

输入指令IN、输出指令OUT:专用于访问I/O

空间。80X86采用独立的I/O编址方式,即采用不同的指令分别访问I/O空间与内存空间。

I/O空间的寻址范围:最大为216=64K字节端口地址大于FFH(255)时,必须固定使用

DX进行“间接”的访问。

累加器AX或AL是数据输入/输出的唯一通路

不影响标志位。32输入指令IN格式:

INAL,8位I/O地址 ;长格式,字节输入

INAX,8位I/O地址 ;长格式,字输入

INAL,DX ;短格式,字节输入

INAX,DX ;短格式,字输入寻址方式:I/O寻址功能:字节输入:将I/O地址所指的端口上的8位数据复制到AL中。字输入:将指令指定的I/O端口上的8位数据复制到AL中;下一个端口地址上的8位数据复制到AH中。33【例】

INAL,0F1HINAX,80HMOVDX,310HINAL,DX34输出指令OUT格式:

OUT8位I/O地址,AL ;长格式,字节输出

OUT8位I/O地址,AX ;长格式,字输出

OUTDX,AL ;短格式,字节输出

OUTDX,AX ;短格式,字输出寻址方式:I/O寻址功能:字节输出:将AL的值复制到I/O地址所指的端口上。字输出:将AL的值复制到指令所指定的I/O端口上,AH的值复制到下一址的端口上。35【例】

OUT85H,ALMOVDX,0FF4HOUTDX,ALMOVDX,30HOUTDX,AX36地址传送指令有效地址传送指令LEA:

LEA16位通用寄存器,存储器源操作数的有效地址EA(不是内容!!)→目标寄存器例:假设SI=1000H,DS=5000H,(51000H)=1234HLEABX,[SI]→执行后:BX=等价于MOVBX,OFFSET[SI]MOVBX,[SI]→执行后:BX=

?1234H1000H?37全地址指针传送指令LDS:从源操作数制定的内存单元中取出4字节内容作为全地址指针,低16位至目标寄存器作为偏移量,高16位送至段基址DS。LDS16位通用寄存器,存储器LDSSI,[450H]→执行后:SI=F346HDS=0A90HMemory0AH……46HF3H90H12450H12451H12452H12453H例:设DS=1200H(12450H)=F346H(12452H)=0A90H38全地址指针传送指令LES:从源操作数制定的内存单元中取出4字节内容作为全地址指针,低16位至目标寄存器作为偏移量,高16位送至段基址ES。

LES16位通用寄存器,存储器39标志传送指令标志装入指令LAHF(Flags)L→AH标志存储指令SAHFAH→(Flags)L标志入栈指令PUSHF

将标志寄存器压入堆栈。标志出栈指令POPF

将栈顶字单元的内容弹到标志寄存器中。全部隐含源、目操作数唯一可改变TF的指令!d15d11d10d9d8d7d6d4d2d0OFDFIFTFSFZFAFPFCF40数据传送指令小结源、目操作数长度必须一致。源、目操作数不能同时是存储器操作数。源、目操作数不能同时是段寄存器。立即数和代码段寄存器CS不能作目操作数。当目操作数是段寄存器时,源操作数不能是立即数。可以使用段寄存器的指令:MOV、PUSH、POP。除SAHF、POPF指令外,其它数传指令的执行不影响标志位。对所有指令都适用!413.3.2算术运算指令加法指令ADD、ADC、INC、AAA、DAA减法指令SUB、SBB、DEC、AAS、DAS、

CMP、NEG乘法指令MUL、IMUL、AAM除法指令DIV、IDIV、AAD、CBW、CWD小结42加法指令1、加指令ADD形式:ADDdst,src

;dst←src+dstdst:R,M;

src:R,M,Im执行后影响所有状态标志SF、ZF、AF、PF、CF、OF2、带进位的加指令ADC形式:ADCdst,src;dst←src+dst+CF其余与ADD指令相同最常用的加法用于高字(字节)相加43【例】对两个8位16进制数5EH和3CH求和,并分析加法运算指令执行后对标志位的影响。

用AL和BL存放两个加数:

MOVAL,5EHMOVBL,3CHADDAL,BL44【例】求两个4字节无符号数0107A379H+10067E4FH的和。

MOVDX,0107HMOVAX,0A379HMOVBX,1006HMOVCX,7E4FHADDAX,CXADCDX,BX453、自加1指令INC指令形式:INCop;op←op+1Op:R,M;执行之后影响标志位SF、ZF、AF、PF、OF

,但不影响CF

【例】INCBLINCCXINCBYTE

PTR[BX]INCWORDPTR[BX]

常用于修改地址指针46加法的十进制调整指令1、非压缩BCD码调整指令AAA(无操作数)何时使用?对什么进行调整?如何调整?影响标志位CF、AF两个非压缩BCD码或ASCII码表示的十进制数相加时自动调整AL中的和,非压缩BCD码的结果存在AL中。若AL低4位大于9或有进位,AH+1→AH47如何调整?若AL低4位>9或半进位标志AF=1,则:①AL←AL+6②用与操作将AL高4位清0③AF置1,CF置1,AH←AH+1否则,仅将AL寄存器的高4位清0。【例】若AL=(9)BCD,BL=(5)BCD,求两数之和。设AH=0

ADDAL,BLAAA4800001001┅9+00000101┅5

00001110┅低4位>9+00000110┅加6调整

00010100┅^00001111┅清高4位00000100┅AL=4CF=1,AF=1,AH=1ADDAL,BL;AAA;结果为AX=0104H,表示非压缩十进制数1449加法的十进制调整指令2、压缩BCD码调整指令DAA(无操作数)何时使用?对什么进行调整?影响SF、ZF、AF、CF、PF两个压缩BCD码相加时自动调整AL中的和,结果在AL中产生一个压缩BCD码的和。若有进位,则CF=150加法的十进制调整指令如何调整?若AL低4位>9或半进位标志AF=1,则:

AL←AL+6,对低半字节进行调整若此时AL中高半字节结果>9或CF=1,则:

AL←AL+60H,对高半字节进行调整,并使

CF置1,否则CF置0。【例】若AL=(88)BCD,BL=(49)BCD,求两数之和。

ADDAL,BLDAA51

10001000

┅88+01001001┅49

11010001┅

AF=1+00000110┅

加6调整

11010111┅

调整后高半字节>

9^01100000┅加60H调整

00110111┅结果为AL=(37)BCD,

CF=1ADDAL,BL;DAA;52减法运算指令1、减法指令SUB形式:SUBdst,src;dst←dst-srcdst:R,M;

src:R,M,Im执行之后影响所有状态标志SF、ZF、AF、PF、CF、OF最常用的减法53减法运算指令2、带借位的减指令SBB形式:SBB

dst,src;dst←dst-src-CFdst:R,M;

src:R,M,Im其余与SUB指令相同!3、自减1指令DEC形式:DECop;op←op-1op:R,M;执行之后影响标志位SF、ZF、AF、PF、OF

,但不影响CF

用于高字(字节)相减常用于修改地址指针54取相反数指令NEG形式:NEG操作数功能:0-操作数内容→操作数影响所有状态标志SF、ZF、AF、PF、CF、OF允许的操作数类型:通用寄存器、存储器实质上,NEG指令执行结果即取原数的相反数。55比较指令CMP使用方法与SUB、SBB相同。功能:目操作数-源操作数,同时影响状态标志SF、ZF、AF、PF、CF、OF

。CMP通常用于比较两个数的大小,而又不破坏原操作数的场合。其后一般紧跟着条件转移指令以实现不同情况下的分支处理。例:

CMPAL,BL;AL-BL,保持寄存器的值不变

JNZEQUAL;若ZF=0(不等),转EQUAL处

……;

ZF=1(相等)情况下的处理不改变操作数本身的值!56减法的十进制调整指令1、非压缩BCD码调整指令AAS(无操作数)

两个非压缩BCD码相减,结果在AL中,用AAS指令进行调整,在AL中得到非压缩BCD码结果。若有借位,AH自动减1。影响CF、AF。如何调整?若AL低4位>9或半进位标志AF=1,则:①AL←AL-6,AF置1②用与操作将AL高4位清0③AH←AH-1,CF置1否则,不需要调整。57减法的十进制调整指令2、压缩BCD码调整指令DAS(无操作数)两个压缩BCD码相减,结果在AL中,用DAS指令进行调整,在AL中得到压缩BCD码结果。影响SF、ZF、AF、CF、PF

。如何调整?若AL低4位>9或半进位标志AF=1,则:

AL←AL-6,AF置1。若此时AL中高半字节结果>9或CF=1,则:

AL←AL-60H,CF置1,58乘法运算指令

无符号数乘法指令:MUL

通用寄存器或存储器带符号数乘法指令:IMUL

通用寄存器或存储器非压缩BCD码乘法调整:AAM

字节相乘:字相乘:

影响标志CF、OF:相乘后若高位(AH或DX)≠0,则将CF、OF置1,否则清0。表明高位内容有效与否。59乘法运算指令如:MULDL;无符号数乘

IMULCX;有符号数乘

MULBYTEPTR[SI]IMULWORDPTR[BX]【例】设AL=55H,BL=14H,计算积。

MULBL

结果AX=06A4H,CF=1,OF=1

【例】设AL=-28,BL=59,计算积。

IMULBL

结果AX=F98CH=-1652,CF=1,OF=1

60除法运算指令无符号数除法指令:DIV

通用寄存器或存储器带符号数除法指令:IDIV

通用寄存器或存储器

BCD码转换成二进制数指令:AAD字节除法:AX值÷操作数内容(8位)→

字除法:DX:AX值÷操作数内容(16位)→IDIV之后,余数与被除数同号除数太小致使商超过规定的长度时,自动转入中断处理。不影响任何标志商→AL余数→AH商→AX余数→DX61符号扩展指令主要用在IDIV指令之前。将被除数的符号位扩展至高位寄存器中,使长度扩展一倍。AL扩展为AX——CBWAX扩展为DX:AX——CWD不影响任何标志位62【例】编程求-38/3的商和余数。

MOVAL,11011010B;被除数-38=-26HMOVCH,00000011B;除数3CBW;将AL符号扩展到AH;AX=1111111111011010BIDIVCH;AX/CH;AL=11110100B=-12(商);AH=11111110=-2(余数)

63算术运算指令小结加、减法的运算结果与两个操作数的长度相等,进、借位反映在标志位上。乘、除法运算仅由指令指定一个操作数,另一个操作数固定为累加器。除了除法和符号扩展指令外,其它算术运算指令均影响状态标志,不同指令对标志位的影响也各不相同。允许使用BCD码进行算术运算。为了得到正确的BCD码运算结果,应使用相应的十进制调整指令。所有的十进制调整均对累加器进行。加、减、乘法的调整在运算之后进行,只有除法必须先调整,后运算。643.3.3逻辑运算及移位指令逻辑运算指令NOT

、AND、TEST、OR、XOR算术移位指令SAL、SAR逻辑移位指令SHL、SHR不带进位的循环移位指令ROL、ROR带进位的循环移位指令RCL、RCR小结65逻辑非指令NOT格式:

NOT通用寄存器或存储器功能:将操作数内容按位取反,结果送回原处。不影响任何标志举例:NOTAXNOTBL NOTBYTEPTR[BX]

66逻辑运算指令逻辑与指令

AND目操作数,源操作数目操作数的内容∧源操作数的内容→目操作数逻辑或指令:OR目操作数,源操作数目操作数的内容∨源操作数的内容→目操作数逻辑异或指令:XOR目操作数,源操作数目操作数的内容⊕源操作数的内容→目操作数允许的操作数类型组合:Dst:R、M;Src:R、M、Im将CF、OF标志清0;影响SF、ZF、PF标志。测试指令TEST:与AND指令的区别仅在于TEST不改变目操作数。其后常紧跟条件转移指令以实现判断分支。67逻辑运算指令的应用1、AND指令通常用于将操作数的某些位清0。如:ANDAL,0FCH;AL的低2位清0,其余保持不变2、TEST指令常用于“取出”操作数的某一位来进行判断。如:TESTAL,20H;取AL的D5位

JZBCLR;ZF=1(该位为0)就到BCLR处3、OR指令通常用于将操作数的某些位置1。如:ORAL,80H;AL的D7位置1,其余位保持不变4、XOR指令通常用于将操作数的某些位取反。如:XORAL,0FH;AL的低4位取反,高4位保持不变68移位指令算术左移指令SAL算术右移指令SAR逻辑左移指令SHL逻辑右移指令SHR注:SAL,SHL效果相同CF0MSBLSBCF0MSBLSBCFMSBLSBCFMSBLSB069格式:

SAL/SAR/SHL/SHR操作数,1 ;移1位

SAL/SAR/SHL/SHR操作数,CL ;移位(CL)次

移位之后改变操作数内容,但CL的值不变允许的操作数类型:通用寄存器、存储器对标志位的影响:移出位→CF;仅当移1位时,影响OF,表明最高位的值有否改编;按照移位后的结果置/复位SF、ZF、PF。应用举例:用移位指令实现乘除法算术运算。70用移位指令实现乘、除法

SALAX,1 ;实现AX×2 MOVBX,AX SALAX,1 ;实现AX×4 ADDAX,BX ;实现AX×6

MOVBL,AL MOVCL,3 SHRAL,CL ;实现AL÷8 SUBBL,AL ;实现AL×7/871循环移位指令不带进位的循环左移指令ROL不带进位的循环右移指令ROR带进位的循环左移指令RCL带进位的循环右移指令RCRCFMSBLSBCFMSBLSBCFMSBLSBCFMSBLSB72格式:

ROL/ROR/RCL/RCR操作数,1 ;移1位

ROL/ROR/RCL/RCR操作数,CL ;移位(CL)次

移位之后改变操作数内容,但CL的值不变。允许的操作数类型:通用寄存器、存储器

如:ROLBX,CLRORWORDPTR[SI],1对标志位的影响:移出位→CF;仅当移1位时影响OF。移出的位不会丢失73逻辑运算及移位指令小结AND、TEST、OR、XOR指令对标志位的影响:固定使CF=OF=0;根据运算结果改变SF、ZF、PF。NOT指令形式上只有一个操作数;不影响任何标志位。SAL、SAR、SHL、SHR指令的使用方法相同,对标志位的影响也相同:移出位给CF;根据结果改变SF、ZF、PF;当移位次数为1时,影响OF。ROL、ROR、RCL、RCR的使用方法相同,对标志位的影响相同:移出位给CF;当移位次数为1时,影响OF。使用SHR或SAR每移1位,可视为分别将无符号数和带符号数除以2;使用SHL/SAL每移1位,可视为将数值乘以2。743.3.4串操作指令串传送指令MOVS、MOVSB、MOVSW串比较指令CMPS、CMPSB、CPMSW串检索指令SCAS、SCASB、SCASW串装入指令LODS、LODSB、LODSW串存储指令STOS、STOSB、STOSW串操作指令重复前缀REP、REPZ/REPE、REPNZ/REPNE小结75串操作的基本概念什么是串?

地址连续的字节或字存储单元,通常用于存放同一类数据。数据源:源串;数据结果:目的串。串操作指令对串元素实现传送、比较、检索、装入、存储等操作,并自动修改地址指针。串操作重复前缀加在串操作指令之前,根据不同条件判断是否重复执行串操作。可以实现对整个串的同一种操作。76串操作指令的特点DS:SI——默认的源串指针,可段超越;

ES:DI——固定的目标串指针,不允许段超越。自动修改串指针:方向标志DF决定指针的修改方向——DF=0,指针加;DF=1,指针减。串元素的类型决定修改量—字节串,指针加/减1;字串,指针加/减2。加有重复前缀时,固定使用CX计录并修改重复次数,再根据CX值及标志位ZF判断是否重复进行串操作。前缀本身不影响任何标志位。77串传送指令格式:

MOVS目标串首址标号,源串首址标号

MOVSBMOVSW功能:将源串中DS:SI所指的串元素复制到目标串中ES:DI所指的单元处;然后自动修改SI、DI。MOVSB、MOVSW分别是字节串和字串的传送指令,隐含了操作数。78重复前缀REP格式:

REP串操作指令功能:

串操作指令执行之后,先修改CX(CX-1→CX),再判断串是否处理完(CX是否为0):不是0,继续执行该串操作指令;否则顺序执行下一条指令。应用举例79串传送举例程序实现‘H’‘E’‘L’‘L’‘O’‘!’源串目标串SRC_MESSNEW_LOC80串传送指令及重复前缀应用例DATASEGMENTSRC_MESSDB‘HELLO!’DATAENDSEXTRASEGMENTNEW_LOCDB6DUP(?)EXTRAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:EXTRASTART:MOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,SRC_MESSLEADI,NEW_LOCMOVCX,6CLD

REPMOVSBCODEENDSENDSTART 81串比较指令格式:

CMPS目标串首址标号,源串首址标号

CMPSBCMPSW功能:用源串中DS:SI所指的串元素值减去目标串中ES:DI所指的串元素值,结果反映在标志位上;自动修改SI、DI。CMPSB、CMPSW分别是字节串和字串的比较指令,隐含了操作数。82重复前缀REPZ/REPE格式:

REPZ/REPE串操作指令功能:

串操作指令执行之后修改CX(CX-1→CX),判断是否满足串未完(CX≠0)、且结果相等(ZF=1):满足则继续执行该串操作指令;否则顺序执行下一条指令。应用举例83串比较指令及重复前缀举例比较两个字符串是否相等:

MOVCX,20 ;源串、目标串的字符个数

LEASI,STR1;STR1:源串的首址标号

LEADI,STR2 ;STR2:目标串的首址标号

CLD ;DF=0,串指针自动增量

REPECMPSB;比较对应元素是否相同。是:继续比,否:执行下条指令

JNZDIFF ;因对应元素不同而退出比较SAME:…… ;因串结束(CX=0)而退出比较84串检索指令格式:

SCAS目标串首址标号

SCASBSCASW功能:用AL(字节串)或AX(字串)的值减去目标串中ES:DI所指的串元素值,结果反映在标志位上;然后自动修改DI。SCASB、SCASW分别是字节串和字串的检索指令,隐含了操作数。实际上是源串固定为累加器的串比较指令85重复前缀REPNZ/REPNE格式:

REPNZ/REPNE串操作指令功能:串操作指令执行之后修改CX(CX-1→CX),判断是否满足串未完(CX≠0)、且结果不等(ZF=0):满足则继续执行该串操作指令;否则顺序执行下一条指令。应用举例86串检索指令及重复前缀举例在一个字符串中检索有无关键字符“$”:

MOVCX,30 ;目标串的字符个数

LEADI,STR2 ;STR2:目标串的首址标号

MOVAL,‘$’ ;关键字符在AL中

CLD ;DF=0,串指针自动增量

REPNESCASB;比较AL与串元素,不同:继续比,相同:执行下条指令

JZ FND ;找到关键字符NOFD:…… ;因串检索结束而退出,未找到87串装入指令格式:

LODS源串首址标号

LODSBLODSW功能:将源串中DS:SI所指的串元素复制到AL(字节串)或AX(字串)中;然后自动修改SI。LODSB、LODSW分别是字节串和字串的装入指令,隐含了操作数。一般不使用重复前缀实际上是目标串固定为累加器的串传送指令88串存储指令格式:

STOS目标串首址标号

STOSBSTOSW功能:将AL(字节串)或AX(字串)的值复制到目标串中ES:DI所指的单元处;然后自动修改DI。STOSB、STOSW分别是字节串和字串的存储指令,隐含了操作数。应用举例实际上是源串固定为累加器的串传送指令89串装入/串存储指令举例

将大写字母组成的源串元素全部转换成小写字母,并存入目标串中:

MOVCX,5 ;串元素的个数

LEASI,STR1 ;SI指向源串(数据段中)

LEADI,STR2 ;DI指向目标串(附加段中)

CLD ;DF=0,串指针自动增量AGN: LODSB ;源串元素装入累加器

ADD AL,20H ;大写字母→小写字母

STOSB ;存入目标串中

LOOPAGN ;循环控制

……903.3.5控制转移指令无条件转移指令JMP过程调用及返回指令CALL、RET条件转移指令:JC/JB/JNAE、JNC/JNB/JAE、JS、JNS、JZ/JE、 JNZ/JNE、JO、JNO、JP/JPE、JNP/JPO、JA/JNBE、JAE/JNB、JB/JNAE、JBE/JNA、JG/JNLE、JGE/JNL、JL/JNGE、JLE/JNG循环控制指令

LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE、JCXZ中断及中断返回指令INT、INTO、IRET小结控制程序流向:改变正常执行顺序,转向新目标91控制转移指令概述所有控制转移指令都只有一个操作数,通过该操作数给出目标地址——新的IP(或CS:IP)值。该类指令对IP(或CS:IP)进行强制性修改,并执行其他相关操作。不影响任何标志位的值。跳变或转移的目标地址距离当前的正常指针的地址偏移量称为“相对偏移量”:相对偏移量=目标地址-当前正常顺序的IP值相对偏移量是一个符号数,正值表示向后跳转,负值表示向前跳转。92控制转移指令可实现三种范围的跳转:近转移(near):段内转移,相对偏移量为1个字,取值范围-32768~+32767;短转移(short):段内转移,相对偏移量为1字节,取值范围-128~+127;远转移(far):段间转移,目标地址与正常顺序的IP值不在同一个代码段内。近转移、短转移采用特殊的“相对寻址方式”来获得转移的目标地址。93相对寻址方式

仅用于进行段内直接转移的控制转移指令。指令操作数是8位或16位带符号相对偏移量,代表目标地址与当前正常顺序的地址之差:

目标地址=当前正常顺序的IP值+相对偏移量编程时一般使用目标地址的标号作为操作数,不需要计算相对偏移量。

例:JNZDIFFRT941无条件转移指令JMP格式:JMP操作数(目标地址)操作数(目标地址)的给出方式段内直接给出:例如

JMP标号

段内间接给出:例如JMPAX/JMPWORDPTR5[BX]

段间直接给出:例如JMPFARPTR标号

段间间接给出:例如JMPDWORDPTR[DI+1200H]功能:按照不同的操作数给出方式,找出目标地址,用它代替原指令指针。可实现全部存储空间内的转移。——相对寻址95示例设CS=2400H,IP=0100H,DS=2000H,BX=100H,标号JNEAR的地址是2400:0450H,标号JFAR的地址是3200:11A0H,

那么有:JMPJNEAR;JMPBXJMPWORDPTR5[BX]JMPFARJFARJMPDWORDPTR[BX]程序分别转向何处运行?962过程调用及返回

过程(Procedure)常称子程序,是指能够完成某种独立功能的程序模块。主程序的调用实质上是一种强制改变正常指令指针顺序的过程,调用之前的正常IP值称为“断点”。CALLRET97过程调用指令CALL格式:CALL操作数(即目标地址)操作数(目标地址)的给出方式段内直接给出,如:CALLNEARPTRSUBP段内间接给出,如:CALLAXCALLWORDPTR[BX+SI]段间直接给出,如:CALLFARPTRSUBP段间间接给出,如:CALLDWORDPTR[DI]98CALL指令执行的操作可实现的转移执行过程段内直接/间接给出近转移——目标地址与控制转移指令位于同一代码段内

SP减2,断点(原IP值)入栈用目标地址(16位操作数的值)代替原IP值段间直接/间接给出远转移——目标地址与控制转移指令位于不同代码段中

SP减2,原CS值入栈

SP再减2,原IP值入栈用目标地址(32位操作数的值)代替原CS:IP值与JMP的不同之处:有对应的返回指令;必须保存断点,执行过程与堆栈有关。99过程返回指令RET格式:

RETRET16位立即数位于被调过程的末尾;必须与CALL指令成对使用!根据对应的CALL指令转移类型,自动确定段内/段间返回。功能:从栈顶弹出1个字(段内返回)或2个字(段间返回),作为返回地址(即断点)给IP或CS:IP;SP相应加2或加4。指令后跟16位立即数,用以在恢复断点后,在现行SP值上再加此数,以释放相应数目的堆栈空间。必须是偶数,为什么?100示例设CS=2400H,IP=1010H,DS=2000H,BX=100H,SS=3000H,SP=0100H,标号SUBN的地址是1200H,标号SUBF的地址是3200:11A0H,

那么有:CALLSUBN;CALLBXCALLWORDPTR5[BX]CALLFARSUBFCALLDWORDPTR[BX]程序分别转向何处运行?堆栈如何变化?1013条件转移指令格式:指令助记符目标地址(短标号)功能:根据当前各标志位状态进行判断,如果满足指令所指定的条件,则转移至目标地址处;否则顺序执行。寻址方式:相对寻址转移范围:短转移,即相对位移量是一个8位的带符号数(-128~+127)。本身并不影响任何标志位102根据单个标志进行判断转移的指令JS JZ/JEJP/JPEJCJOJNSJNZ/JNEJNP/JPOJNCJNO标志位=1则转移:标志位=0则转移:103判断无符号数大小的指令JA/JNBE;目操作数>源操作数则转移JAE/JNB;目操作数≥源操作数则转移JB/JNAE;目操作数<源操作数则转移JBE/JNA;目操作数≤源操作数则转移

通常用在CMP指令之后;由指令自动选择不同标志位,进行不同条件的判断。104判断带符号数大小的指令JG/JNLE;目操作数>源操作数则转移JGE/JNL;目操作数≥源操作数则转移JL/JNGE;目操作数<源操作数则转移JLE/JNG;目操作数≤源操作数则转移通常用在CMP指令之后;由指令自动选择不同的标志位和判断条件。与无符号数不同!1054.循环控制指令格式:

LOOP短标号

LOOPZ/LOOPE短标号

LOOPNZ/LOOPNE短标号

JCXZ短标号寻址方式:相对寻址,只能实现短转移。功能:根据CX的值和ZF标志判断是否转移。指令本身不影响ZF106LOOP指令:CX-1→CXCX≠0?是:转移否:顺序执行LOOPZ指令:CX-1→CXCX≠0且ZF=1?是:转移否:顺序执行LOOPNZ指令:CX-1→CXCX≠0且ZF=0?是:转移否:顺序执行JCXZ指令:CX=0?是:转移否:顺序执行107循环控制转移指令的使用

MOVCX,10

(其它初始条件)NXT:(循环执行的指令)

LOOPNXT

(退出循环后的处理)

MOVCX,10

(其它初始条件)NXT:DECCX

JCXZ

LAST

(循环执行的指令)

JMPNXTLAST:(退出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论