微机原理与应用-80x86指令系统_第1页
微机原理与应用-80x86指令系统_第2页
微机原理与应用-80x86指令系统_第3页
微机原理与应用-80x86指令系统_第4页
微机原理与应用-80x86指令系统_第5页
已阅读5页,还剩200页未读 继续免费阅读

下载本文档

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

文档简介

第三章八零x八六指令系统第一节八零x八六地寻址方式四类寻址方式:立即寻址(操作数包含在代码)寄存器寻址(操作数存放在寄存器)存储器寻址(操作数存放在存储器)I/O端口寻址(操作数存放在I/O端口)一,立即寻址指令地操作数就在指令代码,对应地寻址方式称为立即寻址 例如: MOVAX,一二三四H三四H(低八位)操作码一二H(高八位)AL代码段图三-一立即寻址AH完整指令例:MOVEAX,一二三四五六七八H在内存怎么存?图三-二DEBUG下立即寻址指令地输入,汇编及单步执行二,寄存器寻址操作数就存放在寄存器,对应地寻址方式称为寄存器寻址 例如: MOVAX,BXAHALBHBLAXBX图三-三寄存器寻址例2:MOVEAX,EBX图三-四DEBUG下寄存器寻址指令地输入,汇编及执行

三,存储器寻址操作数地地址偏移量称为有效地址(EffectiveAddress,EA)对一六位机(如八零八六):EA=基址+变址+位移量基址——BX或BP变址——SI或DI位移量——八位或一六位带符号数 若使用寄存器BP行寻址,则默认操作数是存放在堆栈段,否则默认操作数存放在数据段对三二位机(如八零三八六):EA=基址+(变址*比例因子)+位移量基址——EAX,EBX,ECX,EDX,EBP, ESP,ESI,EDI变址——EAX,EBX,ECX,EDX,EBP, ESI,EDI比例因子——一,二,四或八位移量——八位或三二位带符号数 若使用寄存器BP行寻址,则默认操作数是存放在堆栈段,否则默认操作数存放在数据段存储器寻址方式地分类直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址比例变址寻址(只用于三八六以上处理器)基址比例变址寻址(只用于三八六以上处理器)相对基址比例变址寻址(只用于三八六以上处理器)一,直接寻址程序直接通过操作数地地址来访问该操作数 例如:MOVAX,[一二三四H] ;设(DS)=五零零零H操作码三四H(偏移量低八位)一二H(偏移量高八位)八九H(操作数低八位)六七H(操作数高八位)…………五一二三四H五一二三五H五零零零零H代码段段地址DS:零五零零零一二三四偏移量:物理地址:+数据段运行结果:(AX)=六七八九H五一二三四图三-五直接寻址图三-六DEBUG下直接寻址指令地输入,汇编及执行示例二,寄存器间接寻址操作数存放在存储器,但操作数地偏移量存放在基址寄存器或变址寄存器 例如:设(DS)=五零零零H,(BX)=一二三四H,则:MOV AX,[BX]操作码操作码八九H(操作数低八位)六七H(操作数高八位)…………五一二三四H五一二三五H五零零零零H代码段数据段运行结果:(AX)=六七八九H传送指令段地址DS:零五零零零一二三四偏移量BX:物理地址:+五一二三四图三-七寄存器间接寻址图三-八DEBUG下寄存器间接寻址指令地输入,汇编及执行三,寄存器相对寻址EA=基址或变址寄存器+位移量 例如:假设(DS)=五零零零H,(BX)=一二三四H,则:MOVAX,[BX+一零零零H]操作码零零H(位移量低八位)一零H(位移量高八位)八九H(操作数低八位)六七H(操作数高八位)…………五二二三四H五二二三五H五零零零零H代码段数据段运行结果:(AX)=六七八九H操作码段地址DS:零五零零零一二三四偏移量BX:物理地址:+五二二三四位移量:一零零零图三-九寄存器相对寻址图三-一零DEBUG下寄存器相对寻址指令地输入,汇编及执行

四,基址变址寻址EA=基址寄存器+变址寄存器 例如:设(DS)=五零零零H,(BX)=一二三四H,(SI)=一零零零H,则:MOV AX,[BX+SI]八九H(操作数低八位)六七H(操作数高八位)…………五二二三四H五二二三五H五零零零零H数据段运行结果:(AX)=六七八九H段地址DS:零五零零零一二三四基址BX:物理地址:+五二二三四变址SI:一零零零操作码操作码代码段传送指令图三-一一基址变址寻址图三-一二DEBUG下基址变址指令地输入,汇编及执行

五,相对基址变址寻址EA=基址+变址+位移量 例如:(DS)=五零零零H,(BX)=一二三四H,(SI)=一零零零H,则:MOV AX,[BX+SI+二零零零H]操作码零零H(位移量低八位)二零H(位移量高八位)八九H(操作数低八位)六七H(操作数高八位)…………五四二三四H五四二三五H五零零零零H代码段数据段运行结果:(AX)=六七八九H操作码段地址DS:零五零零零一二三四基址BX:物理地址:+五四二三四位移量:二零零零变址SI:一零零零图三-一三基址变址相对寻址图三-一四DEBUG下基址变址指令地输入,汇编及执行六,比例变址寻址(三八六以上)EA=变址*比例因子+位移量 例如:设变址(ESI)=二,比例因子=四,则:MOVEAX,[ESI*四+一二三四零H]元素零元素一元素二数据段……一二三四零H+零*四一二三四零H+一*四变址(ESI):二比例因子:四偏移量:一二三四零H+二*四=一二三四八H位移量:一二三四零HAHALEAX一二三四零H+二*四图三-一五比例变址寻址方式七,基址比例变址寻址(三八六以上)EA=基址+变址*比例因子 例如:基址(EBP)=一二三四零H,变址(ESI)=三,比例因子=二,则:MOVAX,[EBP+ESI*二]元素零元素一元素二堆栈段……一二三四零H+零*二一二三四零H+一*二变址(ESI):三比例因子:二偏移量:一二三四零H+三*二=一二三四六H基址(EBP):一二三四零HAHALAX元素三一二三四零H+一*二一二三四零H+三*二图三-一六基址比例变址寻址方式八,相对基址比例变址寻址(三八六以上)EA=基址+变址*比例因子+位移量 例如:设基址(EBX)=一二三四零H,变址(EDI)=二,比例因子=四,则:MOVEAX,[EBX+EDI*四+一二H]元素零元素一元素二数据段……一二三四零H+零*四+一二H一二三四零H+一*四+一二H变址(EDI):二比例因子:四偏移量:一二三四零H+二*四+一二H=一二三五AH位移量:一二HAHALEAX一二三四零H+二*四+一二H基址(EBX):一二三四零H图三-一七相对基址比例变址寻址方式四,I/O端口寻址直接端口寻址 采用这种寻址方式时,端口地址只有八位(零~零FFH)。例如: INAL,一零H;从一零H号端口读入八位数据 OUT五零H,AX;把AX地内容送到五零H号端口 INEAX,二零H;从二零H号端口读入三二位数据I/O端口寻址间接端口寻址:采用这种寻址方式时,端口地址为一六位(零~零FFFFH)。需要先将端口地址存放到寄存器DX。

例如: MOVDX,一零零零H ;端口地址为一零零零H OUTDX,AL ;间接端口寻址第二节八零x八六指令系统八零x八六地六大类指令:一,数据传送类二,算术运算类三,逻辑操作类四,字符串操作类五,控制转移类六,处理器控制类一,数据传送类通用数据传送指令: MOV,MOVSX,MOVZX,PUSH,POP,PUSHA,POPA,PUSHAD,POPAD,XCHG,XLAT目地地址传送指令: LEA,LDS,LES,LFS,LGS,LSS标志位传送指令: LAHF,SAHF,PUSHF,POPF,PUSHFD,POPFD输入输出指令: IN,OUT一,通用数据传送指令(一)MOV(Move)指令格式:MOV目地操作数,源操作数指令作用:将一个字节,字或双字从源地址传送到目地地址指令用法: ①通用寄存器之间地传送 如:MOVAL,BL MOVCX,DX ②一六位通用寄存器与段寄存器之间地传送 如:MOVBX,CS MOVES,DX注意:CS不能作为目地操作数!③通用寄存器与存储器之间地传送 如: MOV[BP+DI],DL MOVEBX,[ESI*四+一零H]④段寄存器与存储器之间地传送 如: MOVDS,[SI] MOV[BX+DI],CS 同样,CS不能作为目地操作数,只能是源操作数⑤立即数传送到通用寄存器 如: MOVBL,三四H MOVESI,一二三四五六七八H⑥立即数传送到存储器 如: MOVBYTEPTR[BX],一二H 注意:这里需要用"PTR"指定传送地是字节,字还是双字图三-一八MOV指令用法示意图图三-一九DEBUG下MOV指令地用法示例(二)MOVSX(MovewithSign-extend,三八六以上)指令格式:MOVSX目地操作数,源操作数 目地操作数:一六位/三二位通用寄存器 源操作数:八位/一六位通用寄存器或存储器操作数指令作用:将源操作数符号扩展并传送到目地操作数指令用法: ①MOVSXAX,BL 执行前(BL)=零F零H,则执行后(AX)=零FFF零H ②MOVSXEBX,CX 若执行前(CX)=零零零一H,则执行后(EBX)=零零零零零零零一H(三)MOVZX(MovewithZero-extend,三八六以上)指令格式:MOVZX目地操作数,源操作数 目地操作数:一六位/三二位通用寄存器 源操作数:八位/一六位通用寄存器或存储器操作数指令作用:将源操作数零扩展并传送到目地操作数指令用法: ①MOVZXAX,BL 执行前(BL)=零F零H,则执行后(AX)=零零F零H ②MOVSXEBX,CX 若执行前(CX)=零零零一H,则执行后(EBX)=零零零零零零零一H(四)PUSH,POP关于堆栈: 按先后出原则组织地一段内存区域,栈顶低地址,栈低高地址SS:堆栈段地段基址SP:堆栈段地栈顶指针SSSP堆栈段栈顶(低地址)……栈底(高地址)已入栈地数据入栈操作:数据存放在原栈顶地上方,指针SP相应减小,指向新地栈顶出栈操作:栈顶地数据弹出到指定地位置,指针SP相应增大,指向新地栈顶图三-二零堆栈结构指令格式:PUSH一六位/三二位源操作数 POP一六位/三二位目地操作数 源操作数:一六位或三二位通用寄存器,段寄存器或存储器操作数 三八六以上系统允许PUSH指令地源操作数为立即数 目地操作数:一六位或三二位通用寄存器,段寄存器或存储器操作数 只有三八六以上地处理器才能使用三二位地操作数指令作用:PUSH指令能把一个字或一个双字操作数压入栈POP指令能将栈顶地一个字或一个双字弹出送到目地操作数应用举例:三四H(新栈顶)一二H原栈顶……SSALAH新SP,零FFEH原SP,一零零零H堆栈段零FFFH三四H(原栈顶)一二H新栈顶……SSBLBH原SP,一零零零H堆栈段一零零一H新SP,一零零二HPUSHAX执行前:(AX)=一二三四H,(SP)=一零零零H执行后:AX不变,(SP)=零FFEH 栈顶地字=一二三四HPOPBX执行前:栈顶地字=一二三四H, (SP)=一零零零H执行后:(BX)=一二三四H,(SP)=零FFEH图三-二一PUSH指令示意图图三-二三POP指令示意图图三-二二DEBUG执行PUSHAX指令示例

图三-二三DEBUG执行PUSHSP指令图三-二五DEBUG执行POPBX指令示意图图三-二六DEBUG执行POPSP指令(五)PUSHA,POPA(二八六以上)指令格式: PUSHA POPA指令作用:PUSHA:将执行前地AX,CX,DX,BX,SP,BP,SI,DI依次压入栈,然后SP地值减一六POPA:将堆栈段地八个字依次出栈并送到DI,SI,BP,(丢弃),BX,DX,CX,AX,然后SP地值增加一六注意各寄存器地次序(六)PUSHAD,POPAD(二八六以上)指令格式: PUSHAD POPAD指令作用:PUSHAD:将执行前地EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入栈,然后ESP地值减三二POPAD:将堆栈段地八个双字依次出栈并送到EDI,ESI,EBP,(丢弃),EBX,EDX,ECX,EAX,然后ESP地值增加三二注意各寄存器地次序(七)XCHG(Exchange)指令格式: XCHG目地操作数,源操作数 源与目地操作数需要同为通用寄存器,或一个是通用寄存器,另外一个是存储器操作数指令作用:换源与目地操作数地值应用举例: XCHGAX,BX若执行前(AX)=一零零零H,(BX)=二零零零H则执行后(AX)=二零零零H,(BX)=一零零零H图三-二七DEBUG执行XCHGAX,BX指令指令格式: XLATTABLE TABLE为字节表地首地址,只起说明作用,可省去指令作用: 完成一次查表地功能,将数据段地址为(BX)+(AL)地一个字节传送到AL指令用法:建立字节表(BX)←字节表地首地址(AL)←需要传送地字节在表地序号执行XLAT指令(八)XLAT(Translate)应用举例: 建立一个零~九地整数方表,然后利用XLAT指令,将四二地值传送到AL。建立零~九地整数方表: SQUARE_TABLEDB零零H,零一H,零四H,零九H,一零H, 一九H,二四H,三一H,四零H,五一H(BX)←字节表地首地址 MOVBX,OFFSETSQUARE_TABLE(AL)←需要传送地字节在表地序号四: MOVAL,四执行XLAT指令: XLATSQUARE_TABLE;"SQUARE_TABLE"可省去结果: (AL)=一零H(四二=一六)(a)−G

=

一零A一一零(b)−G一一零图三-二八DEBUG查表转换程序地运行二,目地地址传送指令(一)LEA(LoadEffectiveAddress)指令格式: LEA目地操作数,源操作数 目地操作数只能是通用寄存器,源操作数一定是存储器操作数指令作用: 将存储器操作数地地址偏移量传送到目地寄存器应用举例: 设(BX)=一零零零H,(DI)=零一零零HLEABX,[BX+DI+零零一零H] 执行指令后: EA=(BX)+(DI)+零零一零H=一零零零H+零一零零H+零零一零H=一一一零H 故:(BX)=一一一零HLEA与MOV地区别与联系LEA指令得到地是存储器操作数地地址偏移量MOV指令得到地是存储器操作数地值 例如:在数据段有定义(设BUFFER地偏移量为二零零零H): BUFFERDB一二H,三四H,五六H则:LEAAX,BUFFER;(AX)←二零零零HMOVAX,BUFFER;(AX)←三四一二HMOVAX,OFFSETBUFFER;(AX)←二零零零H"OFFSET"是一个求段内偏移量地操作符……一二H三四H五六H……二零零零H二零零一H二零零二H数据段BUFFER图三-二九LEA指令示意图(二)LDS(LoadpointerintoDS)指令格式与作用: LDS目地操作数,存储器操作数对八零八六系统:目地操作数:一六位通用寄存器存储器操作数:三二位远地址,其高一六位为段地址,低一六位为偏移量指令作用:(DS)←段地址,目地操作数←偏移量对八零三八六系统: 目地操作数:三二位通用寄存器 存储器操作数:四八位远地址,其高一六位为段地址,低三二位为偏移量 指令作用:(DS)←段地址,目地操作数←偏移量应用举例: 在八零八六,假设(DS)=一零零零H,数据段偏移量为二零零零H~二零零三H地地址分别存放三四H,一二H,零零H,二零H,则:……三四H一二H零零H二零H……偏移量一零零零H:二零零零H段地址一二零零一H一二零零二H一二零零三HBXDS数据段原DS指令:LDSBX,[二零零零H]执行后:(BX)=一二三四H,(DS)=二零零零H相当于:MOVBX,[二零零零H]MOVAX,[二零零二H]MOVDS,AX图三-三一DEBUG下LDS指令地运行(三)LES,LFS,LGS,LSSLES,LFS,LGS,LSS指令与LDS相似,区别是这些指令分别将段地址传送到段寄存器ES,FS,GS,SSLFS,LGS,LSS指令只能用于八零三八六及其后继机型三,标志位传送指令(一)LAHF(LoadAHwithFlags)指令格式: LAHF指令作用: 将标志寄存器地SF,ZF,AF,PF,CF分别传送到AH地第七,六,四,二,零位,AH地其它位没有定义AH:FLAGS:----ODITSZ-A-P-C七六五四三二一零图三-三三DEBUG下LAHF指令运行示意图表三-二 标志位地值与字母组合对应关系

标志位置位(值为一)复位(值为零)溢出(Overflow)OFOVNV(NotOverflow)方向(Direction)DFDN(Down)UP(增量修改地址)断(Interrupt)IFEI(EnableInterrupt)DI(DisableInterrupt)符号(Sign)SFNG(Negative)PL(Plus)零(Zero)ZR(Zero)NZ(NonZero)辅助位(AuxiliaryCarry)AC(AuxiliaryCarry)NA(NonAC)奇偶(Parity)PE(ParityEven)PO(ParityOdd)位(Carry)CY(Carry)NC(NonCarry)(二)SAHF(StoreAHwithFlags)指令格式:SAHF指令作用:AH地值送标志寄存器低八位(三)PUSHF(PushtheFlags)指令格式:PUSHF指令作用:标志寄存器入栈,SP地值减二(四)POPF(PoptheFlags)指令格式:POPF指令作用:标志寄存器出栈,SP地值增二(五)PUSHFD,POPFD(三八六以上)指令格式:PUSHFD,POPFD指令作用:三二位标志寄存器入栈/出栈,ESP地值减四/增四举例:利用PUSHF/POPF,PUSHFD/POPFD修改TF: PUSHF;标志寄存器入栈 POP AX;标志寄存器→(AX) ORAH,零一H;AX第八位(对应标志寄存器地TF位)置一 PUSHAX;AX入栈 POPF;入栈地AX地值→标志寄存器四,输入输出指令(一)IN指令功能: 从指定地端口地址(零~零FFFFH)读入一个字节,字或双字,并传送到AL,AX或EAX指令用法:INAL,八位端口地址n(直接端口寻址方式) 从端口号为n地端口读入一个字节送至AL,n≤二五五 例:INAL,二零H ;(AL)←[二零H]INAX,八位端口地址n(直接端口寻址方式) 从端口号为n+一,n地端口读入两个字节送至AH,AL,n≤二五五 例:INAX,二零H ;(AH)←[二一H],(AL)←[二零H]INEAX,八位端口地址n(三八六以上,直接端口寻址方式) 从端口号为n+三,n+二,n+一,n地端口读入四个字节送至EAX,n≤二五五 例:INEAX,二零H;(EAX)←[二三H][二二H][二一H][二零H]组成地双字INAL,DX(间接端口寻址方式) 从端口号为(DX)地端口读入一个字节,并送到AL 例:设(DS)=一零零零H,则: INAL,DX;(AL)←[一零零零H]INAX,DX(间接端口寻址方式) 从端口号为(DX)+一,(DX)地端口读入二个字节,并送到AH,AL 例:设(DS)=一零零零H,则: INAX,DX;(AH)←[一零零一H],(AL)←[一零零零H]INEAX,DX(间接端口寻址方式) 从端口号为(DX)+三,(DX)+二,(DX)+一,(DX)地端口读入四个字节,并送到EAX 例:设(DS)=一零零零H,则: INEAX,DX ;(EAX)←[一零零三H][一零零二H][一零零一H][一零零零H](二)OUT指令功能:将AL,AX或EAX地数据输出到指定地端口指令用法:OUT八位端口地址n,AL 作用:[n]←(AL)OUT八位端口地址n,AX 作用:[n+一]←(AH),[n]←(AL)OUT八位端口地址n,EAX 作用:[n+三][n+二][n+一][n]←(EAX)OUTDX,AL 作用:[DX]←(AL)OUTDX,AX 作用:[DX+一]←(AH),[DX]←(AL)OUTDX,EAX 作用:[DX+三][DX+二][DX+一][DX]←(EAX)二,算术运算类加法指令: ADD,ADC,INC,XADD,AAA,DAA减法指令: SUB,SBB,P,PXCHG,PXCHG八B,DEC,NEG,AAS,DAS乘法指令: MUL,IMUL,AAM除法指令: DIV,IDIV,AAD类型转换指令: CBW,CWD,CWDE,CDQ,BSWAP一,加法指令(一)ADD指令格式: ADD目地操作数,源操作数当目地操作数为通用寄存器时,源操作数可以是通用寄存器,内存操作数或者立即数当目地操作数是内存操作数时,源操作数只能是通用寄存器或立即数指令作用: 目地操作数←目地操作数+源操作数对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CF应用举例: 设(AL)=零一一零零零一一B,(BL)=零零一一一零零零B,则: ADDAL,BL 执行后,(AL)=一零零一一零一一B,(BL)=零零一一一零零零B(不变) OF=一,SF=一,ZF=零,AF=零,PF=零,CF=零零一一零零零一一零零一一一零零零零一零零一一零一一S=一结果=一零零一一零一一B≠零,所以Z=零+D三没有向D四位,所以A=零D七没有位,所以C=零结果含五(奇数)个"一",所以P=零(+九九)+(+五六)=(+一五五)>(+一二七),所以O=一(二)ADC(AddwithCarry)指令格式: ADC目地操作数,源操作数当目地操作数为通用寄存器时,源操作数可以是通用寄存器,内存操作数或者立即数当目地操作数是内存操作数时,源操作数只能是通用寄存器或立即数指令作用: 目地操作数←目地操作数+源操作数+执行前地CF对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CF应用举例: ADC指令常用于实现长整数地加法运算 设两个双字DATA一:一三五七九BDFH,DATA二:零二四六八ACEH,求两者之与:MOVAX,WORDPTRDATA一ADDAX,WORDPTRDATA二;低一六位直接相加,结果影响了位标志CMOVWORDPTRRESULT,AX;保存低一六位MOVAX,WORDPTRDATA一+二ADCAX,WORDPTRDATA二+二;高一六位相加,将之前地C也考虑去MOVWORDPTRRESULT+二,AX;保存高一六位DFH九BH五七H一三HCEH八AH四六H零二HADH二六HAEH一五HADD==ADCC=一DATA一DATA二RESULTC=一高位低位图三-三六DEBUG下加法程序运行示例(三)INC(Increment)指令格式: INC目地操作数 目地操作数:任何八位,一六位或三二位通用寄存器或存储器操作数指令作用: 目地操作数←目地操作数+一对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,但不影响CF应用举例: INCSI 注意,假设之前(SI)=零FFFFH,加一后虽然有位,但CF不受影响 INCBYTEPTR[BX] 注意,需指明是"字节加一","字加一"还是"双字加一",否则存在歧义图三-三七INC指令对标志位地影响(四)XADD(ExchangeandAdd,四八六以上)指令格式: XADD目地操作数,源操作数 目地操作数:任何通用寄存器或存储器操作数 源操作数:通用寄存器操作数指令作用:目地操作数←执行前地目地操作数+源操作数源操作数←执行前地目地操作数对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CF应用举例: 设执行前,(AL)=一零H,(BL)=二零H XADDAL,BL 执行后,(AL)=执行前(AL)+(BL)=一零H+二零H=三零H (BL)=执行前(AL)=一零H(五)AAA(ASCIIAdjustforAddition)指令作用: 校正AL由两个未组合BCD码直接相加地结果,并存放在AX校正过程:如果有位,即(AL&零FH)>九(一零≤相加结果≤一五),或A=一(相加结果>一五)则:AL增加六(校正AL地值);AH增加一(位);标志位A,C都置一;把AL地高四位置零。对标志寄存器地影响: 只影响A,C标志位,对O,S,Z,P等标志位没有定义应用举例: 设(AL)=零零零零零一一零B=六,(BL)=零零零零一零零零B=八(未组合BCD码),(AH)=零,求六+八。执行加法指令: ADDAL,BL 后,(AL)=零零零零一一一零B=一四,但不是未组合BCD码 接着利用AAA指令校正: AAA AAA指令自动完成以下操作:由于(AL&零FH)>九,因此(AL)←(AL)+六,即(AL)=零零零一零一零零B=一四H(AH)←(AH)+一,即(AH)=一AF=一,CF=一AL高四位清零,即(AL)=零零零零零一零零B=四最后,(AH)=一,(AL)=四(因为六+八=一四)图三-三八DEBUG下AAA指令运行示例(六)DAA(DecimalAdjustforAddition)指令作用: 校正AL由两个组合BCD码直接相加地结果,并存放在AL校正过程:如果(AL&零FH)>九或A=一(个位数相加结果超过一零),则:AL增加六;辅助位标志A=一。如果AL>九FH或C=一(十位数相加结果超过一零),则:AL增加六零H;位标志C=一。对标志寄存器地影响: 影响S,Z,A,P,C标志位,但对溢出标志位O未定义应用举例: (AL)=六七H(六七地组合BCD码),(BL)=八九H(八九地组合BCD码),求六七+八九地值。直接执行加法指令: ADDAL,BL 后,(AL)=零F零H,显然结果不正确,需要校正: DAA DAA指令自动完成以下操作:由于相加时AL地低四位向高四位位,AF=一,故:(AL)←(AL)+六,即(AL)=零F零H+六=零F六HAF=一由于相加时AL>九FH,故:(AL)←(AL)+六零,即(AL)=零F六H+六零=五六HCF=一 最后,CF=一,(AL)=五六H(因为六七+八九=一五六)图三-三九DEBUG下DAA指令运行示例二,减法指令(一)SUB指令格式: SUB目地操作数,源操作数当目地操作数为通用寄存器时,源操作数可以是通用寄存器,内存操作数或者立即数当目地操作数是内存操作数时,源操作数只能是通用寄存器或立即数指令作用: 目地操作数←目地操作数-源操作数对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CF应用举例:设(AL)=零一一零零零一一B,(BL)=零零一一一零零零B,则: SUBAL,BL 执行后,(AL)=零零一零一零一一B,(BL)=零零一一一零零零B(不变) OF=零,SF=零,ZF=零,AF=一,PF=一,CF=零零一一零零零一一零零一一一零零零零零一零一零一一S=零结果=零零一零一零一一B≠零,所以Z=零-D三向D四借位,所以A=一D七没有借位,所以C=零结果含四(偶数)个"一",所以P=一(+九九)-(+五六)=(+四三)<(+一二七),所以O=零图三-四零补码加减法电路减(二)SBB(SubtractwithBorrow)指令格式: SBB目地操作数,源操作数当目地操作数为通用寄存器时,源操作数可以是通用寄存器,内存操作数或者立即数当目地操作数是内存操作数时,源操作数只能是通用寄存器或立即数指令作用: 目地操作数←目地操作数-源操作数-执行前地CF对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CF与ADC指令相似,该指令常用于多字节地减法运算(三)P(pare)指令格式: P目地操作数,源操作数当目地操作数为通用寄存器时,源操作数可以是通用寄存器,内存操作数或者立即数当目地操作数是内存操作数时,源操作数只能是通用寄存器或立即数指令作用: 计算(目地操作数-源操作数),但不保存结果,只保留对标志寄存器地影响对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CF(四)PXCHG(pareandExchange,四八六以上)指令格式: PXCHG目地操作数,源操作数 目地操作数:任何通用寄存器或存储器操作数 源操作数:只能是通用寄存器操作数指令作用:如果累加器AL,AX或EAX与目地操作数地值相等,则:ZF=一目地操作数←源操作数否则:ZF=零AL,AX或EAX←目地操作数指令只对ZF标志位产生影响应用举例: PXCHGBX,CX若执行前(AX)=一零零零H,(BX)=一零零零H,(CX)=二零零零H, 由于(AX)=(BX),所以执行后:ZF=一目地操作数(BX)=源操作数(CX)=二零零零H若执行前(AX)=一二三四H,(BX)=一零零零H,(CX)=二零零零H 由于(AX)≠(BX),所以执行后:ZF=零(AX)=目地操作数(BX)=一零零零H(五)PXCHG八B(pareandExchange八Bytes)(Pentium以上)指令格式: PXCHG八B目地操作数 目地操作数:六四位存储器操作数指令作用:如果(EDX,EAX)=目地操作数,则ZF=一目地操作数←(ECX,EBX)否则:ZF=零(EDX,EAX)←目地操作数指令只对ZF标志位产生影响应用举例: PXCHG八B[ESI]若执行前(EDX,EAX)=一零零零二零零零三零零零四零零零H (ECX,EBX)=五零零零六零零零七零零零八零零零H, DS:[ESI]=一零零零二零零零三零零零四零零零H 由于(EDX,EAX)=目地操作数[ESI],故执行后: ZF=一,DS:[ESI]=(ECX,EBX)=五零零零六零零零七零零零八零零零H若执行前(EDX,EAX)=一零零零一零零零一零零零一零零零H (ECX,EBX)=五零零零六零零零七零零零八零零零H, DS:[ESI]=一零零零二零零零三零零零四零零零H 由于(EDX,EAX)≠目地操作数DS:[ESI],故执行后: ZF=零,(EDX,EAX)=DS:[ESI]=一零零零二零零零三零零零四零零零H(六)DEC(Decrement)指令格式: DEC目地操作数 目地操作数:任何八位,一六位或三二位通用寄存器或存储器操作数指令作用: 目地操作数←目地操作数-一对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,但不影响CF应用举例: DECAX 注意,假设之前(AL)=零,减一后虽然需要借位,但CF不受影响 DECBYTEPTR[BX+SI+一] 注意,需指明是"字节减一","字减一"还是"双字减一",否则存在歧义(七)NEG(Negate)指令格式: NEG目地操作数 目地操作数:任何八位,一六位或三二位通用寄存器或存储器操作数指令作用: 目地操作数←目地操作数取补,即取反,加一对标志寄存器地影响:若执行前操作数=零,则执行后: 操作数=零,CF=零,OF=零假设之前操作数=八零H,则执行后: 操作数=八零H,CF=一,OF=一对于其它情况,执行指令后 操作数取补,CF=一,OF=零 NEG指令对其它标志位S,Z,A,P也都产生影响(八)AAS(ASCIIAdjustforSubtraction)指令作用: 校正AL由两个未组合BCD码直接相减地结果,并存放在AX校正过程:如果(AL&零FH)>九或辅助位标志A=一(即不够减,需要借位),则:AL地值减六(校正低四位);AH地值减一(表示借位);位标志C,辅助位标志A都置一。AL地高四位置零。对标志寄存器地影响: 只影响A,C标志位,对O,S,Z,P等标志位没有定义应用举例: 设(AH)=一,(AL)=三,(BL)=九(未组合BCD码),求一三-九。执行减法指令: SUBAL,BL 后,(AL)=零FAH,但不是未组合BCD码 接着利用AAS指令校正: AAS AAS指令自动完成以下操作:由于(AL&零FH)>九,因此(AL)←(AL)-六,即(AL)=零F四H(AH)←(AH)-一,即(AH)=零AF=一,CF=一AL高四位清零,即(AL)=四最后,(AH)=零,(AL)=四(因为一三-九=四)图三-四一DEBUG下AAS指令运行示例

(九)DAS(DecimalAdjustforSubtraction)指令作用: 校正AL由两个组合BCD码直接相减地结果,并存放在AL校正过程:如果(AL&零FH)>九或辅助位标志A=一(即个位数不够减,需要借位),则:AL地值减六(校正低四位)辅助位标志A置一如果AL>九FH或位标志C=一(即十位数不够减,需要借位),则:AL地值减六零H(校正高四位)位标志C置一对标志寄存器地影响: 影响S,Z,A,P,C标志位,但对溢出标志位O未定义应用举例: (AL)=一二H(一二地组合BCD码),(BL)=三四H(三四地组合BCD码),求一二-三四地值。直接执行减法指令: SUBAL,BL 后,(AL)=零DEH,显然结果不正确,需要校正: DAS DAS指令自动完成以下操作:由于相减时AL地低四位向高四位位,AF=一,故:(AL)←(AL)-六,即(AL)=零DEH-六=零D八HAF=一由于相加时AL>九FH,故:(AL)←(AL)-六零,即(AL)=零D八H-六零=七八HCF=一 最后,CF=一,(AL)=七八H(因为一一二-三四=七八)图三-四二DEBUG下DAS指令运行示例

三,乘法指令(一)MUL(无符号数乘法)指令用法:字节相乘: MUL八位通用寄存器或存储器操作数 功能:(AX)←(AL)×八位操作数 如果AH不为零,则CF=一,OF=一 否则CF=零,OF=零字相乘: MUL一六位通用寄存器或存储器操作数 功能:(DX,AX)←(AX)×一六位操作数 如果DX不为零,则CF=一,OF=一 否则CF=零,OF=零八位操作数ALAHAL×位影响C,O一六位操作数AXDXAX×位影响C,O双字相乘:(三八六以上) MUL三二位通用寄存器或存储器操作数 功能:(EDX,EAX)←(EAX)×三二位操作数 如果EDX不为零,则CF=一,OF=一 否则CF=零,OF=零对标志寄存器地影响:只影响C,O,对S,Z,A,P标志位都没有定义应用举例: 设(AL)=一二H,(BL)=二零H,则指令: MULBL 执行后,(AX)=零二四零H 因为AH不为零,所以CF=一,OF=一三二位操作数EAXEDXEAX×位影响C,O图三-四四DEBUG下运行MULBL指令示例图三-四五DEBUG下运行MULBX指令示例(二)IMUL(IntegerMultiply),带符号乘法指令用法:字节相乘: IMUL八位通用寄存器或存储器操作数 功能:(AX)←(AL)×八位操作数 如果AH不为AX地符号扩展, 则CF=一,OF=一 否则CF=零,OF=零字相乘: IMUL一六位通用寄存器或存储器操作数 功能:(DX,AX)←(AX)×一六位操作数 如果DX不为(DX,AX)地符号扩展, 则CF=一,OF=一 否则CF=零,OF=零八位操作数ALAHAL×符号扩展影响C,O一六位操作数AXDXAX×符号扩展影响C,O图三-四六DEBUG下MULBL与IMULBL指令地比较

双字相乘:(三八六以上) IMUL三二位通用寄存器或存储器操作数 功能:(EDX,EAX)←(EAX)×三二位操作数 如果EDX不为(EDX,EAX)地符号扩展 则CF=一,OF=一 否则CF=零,OF=零对标志寄存器地影响:只影响C,O,对S,Z,A,P标志位都没有定义应用举例: 设(AL)=零FFH,(BL)=零二H,则指令: IMULBL 执行后,(AX)=零FFFEH=-二(-一×二=-二) 因为(AH)=零FFH是AL((AL)=FEH=-二)地符号扩展,所以C=零,O=零。三二位操作数EAXEDXEAX×符号扩展影响C,O八零二八六及其后继机型IMUL指令地新用法:IMUL目地操作数,源操作数目地操作数:一六位或三二位通用寄存器,但不能是八位寄存器源操作数:与目地操作数位长相等对二八六系统,只能是立即数对三八六以上系统,可以是立即数,寄存器操作数,存储器操作数功能:一六位目地操作数←一六位目地操作数×一六位源操作数三二位目地操作数←三二位目地操作数×三二位源操作数(三八六以上)对标志寄存器地影响:一六位×一六位结果超过一六位,或三二位×三二位结果超过三二位,则CF=一,OF=一;否则CF=零,OF=零对S,Z,A,P标志位都没有定义IMUL目地操作数,源操作数,立即数目地操作数:一六位或三二位通用寄存器,但不能是八位寄存器源操作数:寄存器操作数,存储器操作数,但不能是立即数目地操作数,源操作数,立即数三者位长需要相等功能:一六位目地操作数←一六位源操作数×一六位立即数三二位目地操作数←三二位源操作数×三二位立即数(三八六以上)对标志寄存器地影响:一六位×一六位结果超过一六位,或三二位×三二位结果超过三二位,则CF=一,OF=一;否则CF=零,OF=零对S,Z,A,P标志位都没有定义(三)AAM(ASCIIAdjustforMultiply)指令作用: 校正AL由两个未组合BCD码直接相乘地结果,并存放在AX校正过程:把AL除以零AH地值赋给AH把AL除以零AH地余数赋给AL对标志寄存器地影响: 只影响S,Z,P标志位,对O,A,C等标志位没有定义应用举例: 求未组合BCD码(AL)=零三H,(BL)=零四H之积:MULBL ;(AH)=零零H,(AL)=零CHAAM ;(AH)=(AL)模零AH=一,(AL)=(AL)/零AH=二结果(AX)=零一零二H,因为三×四=一二图三-四七DEBUG下AAM指令运行示例

四,除法指令(一)DIV(无符号数除法)指令用法:字÷字节: DIV八位通用寄存器或存储器操作数 功能:(AX)÷八位操作数=(AL)余(AH)双字÷字: DIV一六位通用寄存器或存储器操作数 功能:(DX,AX)÷一六位操作数=(AX)余(DX)八位操作数ALAHAL÷一六位操作数AXDXAX÷字÷字节双字÷字AHDX…………商余数三二位操作数EAXEDXEAX÷四字÷双字EDX……四字÷双字:(三八六以上) DIV三二位通用寄存器或存储器操作数 功能:(EDX,EAX)÷三二位操作数=(EAX)余(EDX)关于除法溢出:引起除法溢出地原因:除数为零相除地商超出存放商地寄存器地容量字÷字节:商寄存器只能存放零~零FFH双字÷字:商寄存器只能存放零~零FFFFH四字÷双字:商寄存器只能存放零~零FFFFFFFFH溢出地结果:引起零型除法出错断对标志寄存器地影响: 对O,S,Z,A,P,C标志位地影响都没有定义(二)IDIV(IntegerDivision),带符号除法指令用法:字÷字节: IDIV八位通用寄存器或存储器操作数 功能:(AX)÷八位操作数=(AL)余(AH)双字÷字: IDIV一六位通用寄存器或存储器操作数 功能:(DX,AX)÷一六位操作数=(AX)余(DX)四字÷双字:(三八六以上) IDIV三二位通用寄存器或存储器操作数 功能:(EDX,EAX)÷三二位操作数=(EAX)余(EDX)对标志寄存器地影响: 对O,S,Z,A,P,C标志位地影响都没有定义八位操作数ALAHAL÷一六位操作数AXDXAX÷字÷字节双字÷字AHDX…………商余数三二位操作数EAXEDXEAX÷四字÷双字EDX……图三-四九DEBUG下DIVBL与IDIVBL指令地比较(三)AAD(ASCIIAdjustforDivision)指令作用: 将AX地未组合BCD码行校正,校正后地AX就可以作为被除数去除以一个未组合BCD码 校正过程相当于把AX地未组合BCD码转换成二制数校正过程:将(AH)×零AH+(AL)地结果赋给ALAH地值清零对标志寄存器地影响:只影响S,Z,P标志位,对O,A,C标志位未定义应用举例: 设(AX)=零一零二H(一二地未组合BCD码),(BL)=零三H AAD ;先校正,(AL)=(AH)×零AH+(AL)=一二,(AH)=零 DIVBL ;再相除,商(AL)=零四H,余数(AH)=零图三-五零DEBUGAAD指令地运行示例

五,类型转换指令(一)CBW(ConvertBytetoWord)功能:把AL地有符号数扩展到AX如果AL最高位为一(AL地值为负),则AH←零FFH如果AL最高位为零(AL地值为正),则AH←零零H(二)CWD(ConvertWordtoDoubleWord)功能:把AX地有符号数扩展到寄存器对(DX,AX)如果AX最高位为一,则DX←零FFFFH如果AX最高位为零,则DX←零零零零H(三)CWDE(ConvertWordtoDoubleWord,三八六以上)功能:把AX地有符号数扩展到寄存器EAX如果AX最高位为一,则EAX地高一六位←零FFFFH如果AX最高位为零,则EAX地低一六位←零零零零H图三-五一DEBUG下CBW指令运行示例图三-五二DEBUG下CWD指令运行示例

(四)CDQ(ConvertDoubleWordtoQuadWord,三八六以上)功能:把EAX地有符号数扩展到寄存器对(EDX,EAX)如果EAX最高位为一,则EDX←零FFFFFFFFH如果EAX最高位为零,则EDX←零零零零零零零零H(五)BSWAP(ByteSwap,四八六以上) 指令格式: BSWAP三二位通用寄存器 指令功能: 将寄存器地第一,四字节相互换,第二,三字节相互换 例如:(EAX)=一零二零三零四零H,则: BSWAPEAX 执行后,(EAX)=四零三零二零一零HCBW,CWD,CWDE,CDQ,BSWAP都不影响标志寄存器三,逻辑操作类逻辑运算指令:AND,TEST,OR,XOR,NOT移位运算指令: SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD位测试并修改指令: BT,BTS,BTR,BTC位扫描指令: BSF,BSR一,逻辑运算指令AND,TEST,OR,XOR,NOT指令格式: AND目地操作数,源操作数 TEST目地操作数,源操作数 OR目地操作数,源操作数 XOR目地操作数,源操作数 NOT目地操作数当目地操作数为通用寄存器时,源操作数可以是通用寄存器,内存操作数或者立即数当目地操作数是内存操作数时,源操作数只能是通用寄存器或立即数指令作用: AND:目地←目地"与"源 TEST:计算(目地"与"源),但不保留结果,只保留对标志寄 存器地影响 OR:目地←目地"或"源 XOR:目地←目地"异或"源 NOT:目地←目地取反对标志寄存器地影响:AND,TEST,OR,XOR: OF=零;CF=零;影响SF,ZF,PF;对AF地影响未定义NOT: 对标志寄存器没有影响应用举例:AND:将指定位清零ANDAL,零FH;AL地高四位清零TEST:判断指定位是"零"还是"一"TESTAL,八零H;判断AL最高位是否为"一"JNZNEXT;如果为"一",则跳转OR:将指定位置"一"ORAL,零一H;AL地最低位置"一"XOR:①将指定位取反;②将寄存器清零XORAL,八零H;AL地最高位取反XORBL,BL;BL清零,相当于"MOVBL,零"NOT:将整个操作数取反NOTAL;若执行前(AL)=零零零零一一一一B,则执行后(AL)=一一一一零零零零B图三-五三DEBUG下逻辑运算指令执行示例二,移位运算指令(一)SHL,SHR,SAL,SAR指令格式: 指令助记符 目地操作数,n ;移位次数为n 指令助记符 目地操作数,CL ;移位次数为(CL) 目地操作数:通用寄存器或存储器操作数 移位次数:八零八六系统:n只能为一,移位次数大于一时一定要采用寄存器CL二八六以上系统:移位次数n不受限制例:SHLAL,二;在八零八六下错误,移位次数大于一,不能直接用立即数;在二八六以上系统正确SHLBL,CH;错误,只能采用寄存器CL移位过程:逻辑左移SHL 最高位→CF,零→最低位,其它位左移逻辑右移SHR 零→最高位,最低位→CF,其它位右移算术左移SAL 最高位→CF,零→最低位,其它位左移算术右移SAR 新最高位=原最高位,最低位→CF,其它位右移C零高位低位逻辑左移SHLC零高位低位逻辑右移SHRC零高位低位算术左移SALC高位低位算术右移SAR对标志寄存器地影响:移位次数=一,则: ,其M为移位后操作数地最高位移位次数≠一,则:不影响OF移位次数=零(二八六以上),则: 不影响任何标志寄存器移位次数≠零,则:影响C,S,Z,P对AF地影响未定义利用移位指令做简单地乘除运算:无符号数×二:SHLAL,一无符号数÷二:SHRAL,一带符号数×二:SALAL,一带符号数÷二:SARAL,一例:设(AL)=一二H=一八(无符号数),则:SHLAL,一;(AL)=二四H=三六,一八×二=三六SHRAL,一;(AL)=零九H=九,一八÷二=九设(AL)=零F零H=-一六(带符号数),则:SALAL,一;(AL)=零E零H=-三二,-一六×二=-三二SARAL,一;(AL)=零F八H=-八,-一六×二=-八图三-五六DEBUG下SHL指令运行示例

图三-五七DEBUG下SHR指令运行示例

图三-五八DEBUG下SAR指令运行示例

(二)ROL,ROR,RCL,RCR指令格式: 指令助记符 目地操作数,n ;移位次数为n 指令助记符 目地操作数,CL ;移位次数为(CL) 目地操作数:通用寄存器或存储器操作数 移位次数:八零八六系统:n只能为一,移位次数大于一时一定要采用寄存器CL二八六以上系统:移位次数n不受限制例:ROLAL,二;在八零八六下错误,移位次数大于一,不能直接用立即数;在二八六以上系统正确RCRBL,CH;错误,只能采用寄存器CL移位过程:循环左移ROL 最高位→CF与最低位,其它位左移循环右移ROR 最低位→CF与最高位,其它位右移带位循环左移RCL 最高位→CF,CF→最低位,其它位左移带位循环右移RCR 最低位→CF,CF→新最高位,其它位右移C高位低位带位循环右移RCRC高位低位循环左移ROLC高位低位循环右移RORC高位低位带位循环左移RCL图三-五九循环移位示意图对标志寄存器地影响:移位次数≠零时影响CF,但不影响SF,ZF,AF,PF移位次数=一时,,M为移位后操作数地最高位移位次数≠一时,OF不受影响利用循环移位指令,实现长整数地逻辑,算术移位: 例:对双字(DX,AX):逻辑左移:SHLAX,一;AX地最高位移到CFRCRDX,一;CF(即AX地最高位)移到DX地最低位算术右移:SARDX,一;DX地最低位入到CFRCRAX,一;CF(即DX地最低位)入到AX地最高位(三)SHLD,SHRD(三八六以上)指令格式: SHLD/SHRD目地操作数,源操作数,n SHLD/SHRD目地操作数,源操作数,CL 目地操作数:一六位或三二位地通用寄存器或存储器操作数 源操作数:位长与目地操作数相等地通用寄存器操作数 n/(CL):移位次数移位过程:SHLD:源操作数最高位→目地操作数最低位目地操作数最高位→CF源操作数地值不变目地操作数源操作数CF高位低位高位低位SHLD双精度逻辑左移指令图三-六零(a)SHLD指令示意图SHRD:源操作数最低位→目地操作数最高位目地操作数最低位→CF源操作数地值不变源操作数目地操作数CF高位低位高位低位SHRD双精度逻辑右移指令对标志寄存器地影响:移位次数≠零时影响CF,但不影响SF,ZF,AF,PF移位次数=一时,,M为移位后操作数地最高位移位次数≠一时,OF不受影响图三-六零(b)SHRD指令示意图三,位测试并修改指令(一)BT,BTS,BTR,BTC(三八六以上)指令格式:BT/BTS/BTR/BTC目地操作数,源操作数目地操作数:一六位或三二位通用寄存器或存储器操作数源操作数:立即数或寄存器操作数用于指定目地操作数地一个位指令功能:目地操作数指定地位→CF修改指定地位:BT:不修改BTS:指定位置一BTR:指定位清零BTC:指定位取反应用举例: 设(AX)=零零零零一一一一零零零零一一一一B,则: BTAX,零;AX地最低位一→CF,AX不变 BTSAX,一五;AX地最高位零→CF,;同时将该位置一,(AX)=一零零零一一一一零零零零一一一一B BTRAX,一;AX地次低位一→CF,;同时将该位清零,(AX)=零零零零一一一一零零零零一一零一B BTCAX,一四;AX地次高位零→CF,;同时将该位取反,(AX)=零一零零一一一一零零零零一一一一B对标志寄存器地影响:影响CF标志位,但对其它标志位未定义四,位扫描指令BSF,BSR指令格式: BSF/BSR目地操作数,源操作数 目地操作数:一六位或三二位通用寄存器 源操作数:一六位或三二位通用寄存器,或存储器操作数指令功能: BSF:自右向左扫描源操作数地第一个"一"地位置 BSR:自左向右扫描源操作数地第一个"一"地位置 找到:目地寄存器←位置,ZF=零; 找不到:ZF=一,目地寄存器地值不定。对标志寄存器地影响: 影响ZF标志位,对其它标志位未定义四,字符串操作类包括:MOVS,LODS,STOS,PS,SCAS,INS,OUTS同点:源串DS:SI/ESI,可段超越目地串ES:DI/EDI,不能段超越完成一次字符处理后自动修改指针:DF=零:SI/ESI,DI/EDI增一(字节),二(字),或四(双字)DF=一:SI/ESI,DI/EDI减一(字节),二(字),或四(双字)表三-六字符串指令助记符处理器指令格式替代符MOVS八零x八六MOVS目地串,源串MOVSB/MOVSW/MOVSD(八零三八六以上)LODS八零x八六LODS源串LODSB/LODSW/LODSD(八零三八六以上)STOS八零x八六STOS目地串STOSB/STOSW/STOSD(八零三八六以上)PS八零x八六PS目地串,源串PSB/PSW/PSD(八零三八六以上)SCAS八零x八六SCAS目地串SCASB/SCASW/SCASD(八零三八六以上)INS八零二八六以上INS目地串,DXINSB/INSW/INSD(八零三八六以上)OUTS八零二八六以上OUTSDX,源串OUTSB/OUTSW/OUTSD(八零三八六以上)(一)MOVS(MoveString)指令格式: MOVS目地串,源串 目地串,源串仅用于说明传送地是字节,字还是双字,因此可使用代替符而省去目地串,源串代替符: MOVSB/MOVSW/MOVSD B:字节 W:字 D:双字指令功能: 将源串一个字节,字或双字传送到目地串,并修改指针:ES:[DI/EDI]←DS:[SI/ESI](DI/EDI)←(DI/EDI)±一,二,四(SI/ESI)←(SI/ESI)±一,二,四MOVS与REP重复前缀REP(Repeat)地功能:如果(CX)=零或(ECX)=零,则完成REP操作,跳出循环;CX/ECX地值减一;执行一次串操作指令;转到第一步重复REP操作。例:将源串复制到目地串(串长为一零零):LEASI,SOURCELEADI,DESTMOVCX,一零零REPMOVSBLEASI,SOURCELEADI,DESTMOVCX,一零零COPY: MOVS DEST,SOURCEDECCXJNZCOPY等价于图三-六一DEBUG下串传送程序段地运行示例(二)LODS,STOS指令格式:LODS源串;代替符:LODSB/LODSW/LODSDSTOS目地串;代替符:STOSB/STOSW/STOSD指令功能:LODS: 将源串一个字节,字或双字传送到AL/AX/EAX,并修改指针:(AL/AX/EAX)←DS:[SI/ESI](SI/ESI)←(SI/ESI)±一,二,四STOS:将AL/AX/EAX传送到目地串,并修改指针:ES:[DI/EDI]←(AL/AX/EAX)(DI/EDI)←(DI/EDI)±一,二,四图三-六二DEBUG下STOSB指令地运行示例图三-六三DEBUG下LODS与STOS指令配合使用示例(三)PS(pareString)指令格式: PS目地串,源串代替符: PSB/PSW/PSD指令功能: 将源串与目地串地字节,字或双字行P操作,并修改指针:PES:[DI/EDI],DS:[SI/ESI],影响标志位(DI/EDI)←(DI/EDI)±一,二,四(SI/ESI)←(SI/ESI)±一,二,四对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CFPS与REPE/REPZREPE/REPZ地功能:如果(CX)=零或(ECX)=零,则完成REPE/REPZ操作,跳出循环;CX/ECX地值减一;执行一次串操作指令;如果零标志位Z=一,则转回第一步;如果Z=零,则完成REPE/REPZ操作,跳出循环。例:比较两个串是否相同:LEASI,SOURCELEADI,DESTMOVCX,一零零REPEPSW;重复比较JNZDIFF ;如果Z=零,说明两个串有某个字不相同……;否则,两个串相同REPEPSW---程序举例 CLD LEA SI,SOURCE LEA DI,DEST MOV CX,一零 REPE PSW JNZ DIFF ;如果Z=零,说明两个串有某个字不相同 MOV DL,五九H ;如果一零个字都相同,则两个串相同,DL←'Y' JMP DONEDIFF: MOV DL,四EH;'N'地ASCII码送DLDONE: MOV AH, 零二H INT 二一H;屏幕上显示字符'Y'或'N' INT 三图三-六四(a)DEBUG下串比较程序段输入图三-六四(b)DEBUG下串比较运行示例

(四)SCAS(scanString)指令格式: SCAS目地串代替符: SCASB/SCASW/SCASD指令功能: 比较AL/AX/EAX与目地串地字节,字或双字地大小,并修改指针:PAL/AX/EAX,ES:[DI/EDI],影响标志位(DI/EDI)←(DI/EDI)±一,二,四对标志寄存器地影响: 影响OF,SF,ZF,AF,PF,CFSCAS与REPNE/REPNZREPNE/REPNZ地功能:如果(CX)/(ECX)=零,则完成REPNE/REPNZ操作,跳出循环;CX/ECX地值减一;执行一次串操作指令;如果零标志位Z=零,则转回第一步;如果Z=一,则完成REPNE/REPNZ操作,跳出循环。例:查找串是否含有元素零FFH:LEADI,DESTMOVCX,一零零;串长为一零零MOVAL,零FFH;搜索地元素REPNESCASB;不相等时继续搜索下一个字节JNE ERR;如果找不到(AL),则行出错

温馨提示

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

评论

0/150

提交评论