【文档说明】计算机组成原理与汇编语言程序设计第4章5课件.ppt,共(51)页,244.805 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-76281.html
以下为本文档部分文字说明:
计算机组成原理与汇编语言程序设计第4章5①ADD加法指令指令格式:ADDDEST,SRC指令功能:DEST(SRC)+(DEST),即源操作数与目的操作数相加,其和送入目的地址中。并根据相加结果设置FLAGS的OF、SF、ZF、AF、PF和CF标志位。该指令执行后,源操作
数保持不变。【例4-29】加法指令的常用格式有:ADDBX,SIADDDA_WORD,0F8CHADDDL,TAB[BX]下面以指令“ADDDL,0A4H”为例,给出该指令的相加及标志位设置过程。设DL的内容为0E5H:结果不为零,则ZF0;结果无溢出,则OF0;结果
中有奇数个1,则PF0。需要指出,溢出位OF表示带符号数的溢出,它是根据数的符号及其变化来设置的。而CF位可以表示无符号数的溢出。执行下面两条指令后,标志寄存器中CF、AF、ZF、SF和OF、PF分别是什么状
态?MOVAL,91ADDAL,0BAH在实模式下,假设(DS)=1234H,(SI)=124H,(12464H)=30ABH,(12484H)=464H,有以下程序段:LEASI,[SI]MOVAX,[SI]MOV[SI+22H],1200HLDSSI,[SI+20H]ADDAX,[SI
]上述程序段执行后,(DS)=?(SI)=?(AX)=?②ADC带进位加法指令指令格式:ADCDEST,SRC指令功能:DEST(SRC)+(DEST)+CF,即在完成两个操作数相加的同时,将标志位CF的值加上,求出的和数
送入目的地址中;并根据相加的结果设置标志位OF、SF、ZF、AF、PF和CF。【例4-30】在8086/80286中实现两个双精度数的加法。有一个32位无符号数存放在DX(高16位)、AX(低16位)中,若要加上常数76F1A23H,则用以下指令来实现:ADDAX,1A23HADCD
X,76FH其中第一条指令完成把16位常数加在AX中,若产生进位,则记录在CF中。由ADC指令在完成高16位相加的同时,将低16位的进位也加上。③INC加1指令指令格式:INCDEST指令功能:DEST(DEST)+1,即目的操作数加1后送回目的地址中,并
根据执行结果设置标志位OF、SF、ZF、AF和PF,但不影响CF。INC指令只有一个操作数,操作数可以是字节、字或双字,且被当作无符号数。(2)减法运算指令SUB(SUBtract)减法。SBB(SuBtractwithBorrow)带借位减法。
DEC(DECrement)减1。NEG(NEGate)求补。CMP(CoMPare)比较。①SUB减法指令指令格式:SUBDEST,SRC指令功能:DEST(DEST)(SRC),即完成从目的操作数中减
去源操作数,其差值送入目的地址中;并按相减结果设置标志位OF、SF、ZF、AF、PF和CF。【例4-32】SUB指令的常用格式如下:SUBAL,3FHSUBBX,AX下面以指令“SUBAL,DAB”为例,给出该指令的相减及设置标志位过程。设
AL内容为B7H,DAB字节单元内容为A8H:结果不为零,则ZF0;结果无溢出,则OF0;结果中有偶数个1,则PF1。②SBB带借位减法指令指令格式:SBBDEST,SRC指令功能:DEST(DEST)(SRC)CF,即在完成两个操作数相减的同时,还要减去借位位CF,相减结果
送入目的地址中;并设置标志位OF、SF、ZF、AF、PF和CF。③DEC减1指令指令格式:DECDEST指令功能:DEST(DEST)1,即目的操作数减1后送回目的地址中;并根据执行结果设置标志位OF、SF、ZF、AF和PF,但不影响CF。④NEG求补指令指令格式:NEGDEST指令
功能:DEST0(DEST),即用零减去目的操作数,相减结果送回目的地址中;并按结果设置标志位OF、SF、ZF、AF、PF和CF。NEG指令属单操作数指令,操作数可以是字节、字或双字,且被当作补码表示的带符号数。如果字节操作数是128、字操作数是32768,在执行N
EG指令后,操作数不变,但溢出标志OF置1。这是由于+128或+32768超出了8位或16位带符号数的表示范围,即产生了溢出。如操作数为零,求负的结果仍为零,则标志位CF置0;否则CF置1。NEGALNEGBL以上指令执行后,A
L中为负数25H的补码:(AL)DBH11011011B。BL中则为正数:(BL)58H01011000B。【例4-34】设AL中存放一正数:(AL)25H00100101B。BL中存放负数58H的补码:(
BL)A8H10101000B。可用以下指令获得AL、BL中数的负数:假设(AX)=0FFFFH,有以下程序段:INCAXNEGAXDECAXNEGAX上述程序段执行后,(AX)=?⑤CMP比较指令指令格式:CMPDEST,SRC指令功能:(D
EST)(SRC),两个操作数相减后,仅按相减结果设置标志位OF、SF、ZF、AF、PF和CF,而不保留两数相减的差。CMP指令与SUB指令的不同之处是,运算结果不送回目的地址中。因此CMP指令执行后
,两个操作数都不变,只影响状态标志位。CMP指令后往往跟着一个条件转移指令,根据比较结果产生不同的程序分支。例如:CMPAL,BLJZEQLCMP指令可利用所设标志位的状态来反映两个操作数的大小。CMP指令
执行后,若ZF1,表示(DEST)(SRC)。对于无符号数,若CF0,表示(DEST)≥(SRC);若CF1,则(DEST)<(SRC)。(3)乘法运算指令MUL(unsignedMULtiple)无符号数乘法。IMUL(sIgnedMULtiple
)带符号数乘法。①MUL无符号数乘法指令指令格式:MULSRC指令功能:字节操作数AX(AL)*(SRC)字操作数DX:AX(AX)*(SRC)其中(SRC)是乘法运算的一个操作数,它只能在通用寄存器或存储单元中(不能是立即
数),而另一个操作数隐含在AL(字节乘)、AX(字乘)或EAX(双字乘)寄存器中。MUL指令只影响标志寄存器中CF、OF标志位。MUL指令执行后,如果乘积的高一半为0,即AH(字节乘)、DX(字乘法)或EAX(双字乘)全为0,则CF0和OF0;否则CF1,OF1
(表示AH、DX或EDX中有乘积的有效数字)。②IMUL带符号数乘法指令指令格式:IMULSRC指令功能:与MUL相同,但操作数和乘积必须是带符号数且用补码表示,而MUL的操作数和乘积均是无符号数。执行IMUL指令后,如果乘积的高一半是低一半的符号扩展,则CF和OF均为0;否则均为1。【例4
-35】设(AL)0B4H76D,(BL)11H17D;执行指令“IMULBL”后:乘积为(AX)0FAF4H1292D,CFOF1。【例4-36】设(AL)0AH10D,(BL)11H17D;执行指令“MULBL“后:乘积为(AX
)00AAH0170D,CFOF0。(4)除法运算指令DIV(unsignedDIVide)无符号数除法。IDIV(sIgnedDIVide)带符号数除法。①DIV无符号数除法指令指令格式:DIVSRC指令功能:将隐含存放在AX(字节除)、DX:AX(字除)或EDX:EAX(双字除)
中的被除数除以除数(SRC),除后的商和余数送入隐含指定的寄存器中。字节操作:AL(AX)/(SRC)的商AH(AX)/(SRC)的余数字操作:AX(DX:AX)/(SRC)的商DX(DX:AX)/(SRC)的余数D
IV指令中的被除数和除数必须是无符号数,其商和余数也是无符号数。DIV指令对标志寄存器无有效标志结果。但是以下两种情况之一,将产生0型中断(除法出错中断)转入除法出错中断处理。•除数为0,即(SRC)=0。•商溢出,即(AL)中的商>0FFH,(AX)中的商>0FFFFH②IDIV带符号数除法指令
指令格式:IDIVSRC指令功能:与DIV相同,但操作数、商和余数必须是带符号数且用补码表示,余数的符号与被除数的符号相同。带符号数除法的商中,最大的正数商是+127(7FH)、+32767(7FFFH)或+65535(7FFFFFFFH
),最小的负数商是127(81H)、32767(8001H)或65535(80000001H)。同DIV指令一样,当除数(SRC)0或商超出上述的最大值或最小值时,均产生0型中断。由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,双字操作要求被除数为64位
,因此往往需要用符号扩展的方法取得除法指令所需要的被除数格式。【例4-39】两个8位带符号数分别放在BYTE1、BYTE2字节存储单元中,将BYTE1内容除以BYTE2内容,商放在QUOT字节单元中,可用以下指令实现:MOVAL,BYTE1CBWIDIVBYT
E2MOVQUOT,AL假设DAW1和DAW2分别是两个字单元的符号地址,请按下列要求写出指令序列:(1)DAW1和DAW2两个字数据相乘(用MUL)。MOVAX,DAW1MULDAW2(2)DAW1除以23(用DIV)。MOVAX,D
AW1MOVBL,23DIVBL3.逻辑类指令这类指令包括逻辑运算指令、位测试指令、位扫描指令和移位指令。(1)逻辑运算指令逻辑运算指令共有5条,其指令格式及功能分别如下:AND逻辑与指令指令格式:ANDDEST,SRC指令功能:DEST(SRC)∧(DEST)OR逻辑或指令
指令格式:ORDEST,SRC指令功能:DEST(SRC)∨(DEST)XOR逻辑异或指令指令格式:XORDEST,SRC指令功能:DEST(SRC)(DEST)NOT逻辑非指令指令格式:NOTDEST指令功能:DEST(DEST)TEST测试指令指令格式:
TESTDEST,SRC指令功能:(SRC)∧(DEST)上述指令对操作数都是按位进行逻辑运算的,操作数可以是字节、字或双字。NOT指令对标志位无影响,其余4条指令影响的标志位是SF、ZF、PF,置CF、OF为0,AF不确定。TEST指令与AND指令的不同之处是,运算结果不送回目的地址中。
因此TEST指令执行后,两个操作数都不变,只影响标志位。这些指令常用于对操作数的某些位进行分离、组合或设置,例如:ANDAL,0F0H;分离出AL中的高4位ORAL,80H;将AL中最高位置1XORAX,AX;将AX内容清零XORAL,
01H;将AL中最低位变反【例4-40】可用以下程序段实现将标志寄存器的第8位TF位置1:PUSHFPOPAXORAX,100HPUSHAXPOPF假设(AX)=0FF60H,有以下程序段:STCMOVDX,96XORDH,0FFHSBBAX,DX上述程序段
执行后,(AX)=?CF=?(4)移位指令移位指令可按操作数的个数分为单操作数移位指令(8条)和双操作数移位指令(2条)。80386及其后继机型增加的双精度移位指令就是双操作数移位指令。SHL(SHiftlogicalLeft)逻辑左移。SAL(ShiftArithmetic
Left)算术左移。SHR(SHiftlogicalRight)逻辑右移。SAR(ShiftArithmeticRight)算术右移。ROL(ROtateLeft)循环左移。ROR(ROtateRight)循环右移。RCL(RotateLeftthroughCarry)带进位
循环左移。RCR(RotateRightthroughCarry)带进位循环右移。①单操作数移位指令这种移位指令共有8条,它们可以对通用寄存器或存储单元中的操作数进行指定移位,即一次可只移一位或按CL中的内容规定移位次数(位数)。移位
指令可分为:算术移位指令、逻辑移位指令和循环移位指令。这8条指令有如下共同点:具有相同的指令格式OPRDEST,COUNT。每条指令都是单操作数指令,即只需一个操作数DEST。DEST只能是8/16/32位通用寄存器或存储器操作数,不能是立即数。但只有80386及其后继机型才能使
用32位操作数。COUNT表示移位次数对于8086/80286,移位一次,COUNT可用常数1替代;移位多次,则必须用CL替代,CL中存放移位次数。对于80386及其后继机型,COUNT还可以是8位立即数,可指定1~31的移位次数。a.算术移位指令指令
格式:算术左移指令SALDEST,COUNT算术右移指令SARDEST,COUNT指令功能:算术左移指令将DEST指定的8/16/32位操作数左移COUNT次。最高位移入CF中,最低位补0,移位操作如图(a)所示。算术右移指令将DEST指定的8/16/32位操作数右
移COUNT次。右移时,最高符号位保持不变,连同符号位依次右移,最低位移入CF中,如图(b)所示。算术移位指令主要用于对带符号数的移位,左移一位相当于乘2;右移一位相当于除2。算术移位后应保持该数的符号不变。例如:(AL)1100000
1B(63的补码),(BL)10111111B(负数65的补码)。以下指令将AL、BL中的数左移一位:SALAL,1SALBL,1以上指令执行后,(AL)10000010B即126的补码,不溢出OF0,结果符合倍增关系;而(BL)01111110B,左移后发
生溢出,则OF1,因此BL内容不再符合倍增关系。通常算术移位指令用于实现带符号数的简单乘除运算,其执行时间比用乘除指令短得多。例4-44AX中已存放一个带符号数,若要完成(AX)*3÷2运算,可用以下程序段实现:MOVDX,AXSALAX,1ADDAX,DXSARAX,1
b.逻辑移位指令指令格式:逻辑左移指令SHLDEST,COUNT逻辑右移指令SHRDEST,COUNT指令功能:将DEST指定的8/16/32位寄存器或存储器操作数移位COUNT次。SHL实现将操作数左移,最高位移入CF中,最低位
补0,如图(a)所示。SHR实现将操作数右移,最低位移入CF中,最高位补0,如图(b)所示。例4-45要求把由CL中的数(0-15)所指定的AX中的位分离出来,可用以下程序段实现:MOVBX,1SHLBX,CLANDAX,BXc.循环移位指令指令格式:
循环左移指令ROLDEST,COUNT循环右移指令RORDEST,COUNT带进位循环左移指令RCLDEST,COUNT带进位循环右移指令RCRDEST,COUNT指令功能:将DEST指定的8/16/32位寄存器或存储器操作数移位COUNT次。ROL/ROR实现将操作数循环左移/
右移。RCL/RCR实现将操作数和CF一起循环左移/右移。受影响的状态标志位:CF、OF。CF存放每次移出的位。如果移位指令只移一位,且移位前后操作数的符号位发生变化,则将OF置1;否则OF置0。如移位次数大于1,则OF不确定。循环移位指令的移位操
作如下图所示:当多字节或多字数据进行移位时,常用到带进位循环移位指令。【例4-46】由3个字构成的一个无符号数从高位到低位依次存放在M+4,M+2,M字单元中,若要将该数右移一位,则可用以下程序段实现:SHRM+4
,1RCRM+2,1RCRM,1如下图所示,SHR指令将M+4字单元的最低位移至CF中。第2条指令RCR将CF与M+2字单元构成一个17位的数进行一次循环右移,将M+4单元右移出的位通过CF移至M+2单元的最高位,而M+2中的最低位又移至CF。
在第3条指令执行后,就完成将3个字的数右移一位。假设(AX)=0A5C6H,(CX)=0F03H,有以下程序段:STCRCLAX,CLANDAH,CHRCRAX,CL上述程序段执行后,(AX)=?CF=?(AX)=81C6H,CF=
1试分别指出下列各指令语句的语法是否有错,若有错,指明是什么错误。1、MOVAL,0F5H2、ADD[BX][BP],BX3、CMPAL,100H4、TEST[BP],DL5、ADC15H,CL6、SUB[DI],DA_WORD7、ORCH,CL
8、MOVAL,1000H9、SAR10H[DI],210、NOTAL,BL11、DECCX,112、LEAES,TAB[BX]4.串操作类指令MOVS(MOVeString)串传送。CMPS(CoMPareStri
ng)串比较。SCAS(SCAnString)串扫描。LODS(LOaDfromString)取串。STOS(STOreintoString)存串。INS(INputfromporttoString)串输入。OUTS(OUTputStringtoport)串输出。与上述基本指令配合使用的前
缀有:REP(REPeat)重复。REPE/REPZ(REPeatwhileEqual/Zero)相等/为零则重复。REPNE/REPNZ(REPeatwhileNotEqual/NotZero)不相等/不为零则重复。(1)取串指令(LoadStrin
g)指令格式:LODS源串LODSB;取字节串LODSW;取字串指令功能:字节操作AL(DS:(SI/ESI)),SI/ESI(SI/ESI)1字操作AX(DS:(SI/ESI)),SI/ESI(SI/ESI)2双字操作EAX(DS:(SI/ESI)
),SI/ESI(SI/ESI)4该指令把由源变址寄存器指向的数据段中某单元(字节/字/双字)的内容送到AL、AX或EAX中,并根据方向标志DF和数据类型(字节、字或双字)修改源变址寄存器的内容。若D
F0表示串操作按地址递增的方向处理,则修改SI/ESI内容用“+”;若DF0表示串操作按地址递减的方向处理,则修改SI/ESI内容用“-”。该指令也不影响标志位。(2)存串指令(StoreString)指令格式:STOS目的串STOSB;存字节串STOSW;存字串指令功能:字节
操作ES:(DI/EDI)(AL),DI/EDI(DI/EDI)1字操作ES:(DI/EDI)(AX),DI/EDI(DI/EDI)2双字操作ES:(DI/EDI)(EAX),DI/EDI(DI/EDI)4
该指令把AL、AX或EAX的内容存入由目的变址寄存器指向的附加段的某个单元中,并根据DF的值及数据类型修改目的变址寄存器的内容。该指令不影响标志位。(3)串传送指令(MoveString)指令格式:MOVS目的串,
源串MOVSB;字节串传送MOVSW;字串传送指令功能:字节操作ES:(DI/EDI)(DS:(SI/ESI))SI/ESI(SI/ESI)1;DI/EDI(DI/EDI)1字操作ES:(DI/EDI)(DS:(SI/ESI))SI/ESI(SI/ESI
)2;DI/EDI(DI/EDI)2双字操作ES:(DI/EDI)(DS:(SI/ESI))SI/ESI(SI/ESI)4;DI/EDI(DI/EDI)4MOVS指令把由源变址寄存器指向的数据段中的一个字节
(或字,或双字)传送到由目的变址寄存器指向的附加段中的一个字节(或字,或双字)单元中去,同时根据方向标志DF及数据类型对源变址寄存器和目的变址寄存器进行修改。该指令不影响标志位。(4)串比较指令(CompareString)指令格式:CMPS目的串,源串CMPSB;字
节串比较CMPSW;字串比较指令功能:字节操作(DS:(SI/ESI))(ES:(DI/EDI))SI/ESI(SI/ESI)1;DI/EDI(DI/EDI)1字操作(DS:(SI/ESI))
(ES:(DI/EDI))SI/ESI(SI/ESI)2;DI/EDI(DI/EDI)2双字操作(DS:(SI/ESI))(ES:(DI/EDI))SI/ESI(SI/ESI)4;DI/EDI
(DI/EDI)4CMPS指令比较源串和目的串中的一个字节、字或双字。即:将源变址寄存器指向数据段中的一个字节(或字,或双字)减去目的变址寄存器指向附加段中的一个字节(或字,或双字),不保留相减结果,但设
置标志位:OF、SF、ZF、AF、PF和CF。每比较一次,根据方向标志DF及数据类型对源变址寄存器和目的变址寄存器进行修改。(5)串搜索指令(ScanString)指令格式:SCAS目的串SC
ASB;字节串搜索SCASW;字串搜索指令功能:字节操作(AL)(ES:(DI/EDI));DI/EDI(DI/EDI)1字操作(AX)(ES:(DI/EDI));DI/EDI(DI/EDI)2双字操作(EAX)(ES:(DI/EDI));DI/EDI(D
I/EDI)4SCAS指令在目的串中查找AL、AX或EAX指定的内容,即:用AL、AX或EAX的内容减去目的变址寄存器指向附加段中的一个字节(或字,或双字),不保留相减结果,但设置标志位:OF、SF、ZF、AF、PF和CF。每查找一次,根据方
向标志DF及数据类型对目的变址寄存器进行修改。(6)重复前缀指令(Repeat)重复前缀指令共有3条。①指令格式:REPstringprimitive其中stringprimitive可为MOVS、STOS、LODS、INS和OUTS指令
。指令功能:a.如(CX/ECX)0,则退出REP,否则往下执行;b.(CX/ECX)(CX/ECX)1;c.执行其后的串指令;d.重复a~c步骤。该指令中,如16位寻址,使用CX作为计数器;如32位寻址,用ECX作为计数器。②指令格式:REPEstringprimitive或REPZs
tringprimitive其中stringprimitive可为CMPS和SCAS指令。指令功能:a.如(CX/ECX)0或ZF0时退出,否则往下执行;b.(CX/ECX)(CX/ECX)1;c.执行其后的串指令;d.重复a~c步骤。有关计数寄存器的规定和REP相
同。与REP相比,除满足(CX/ECX)0的条件可结束操作外,还增加了ZF0的条件。也就是说,在每次比较时,只要两数相等(即ZF1)就继续比较,如果遇到两数不相等时(即ZF0)就提前结束操作。③指令格式:REPNEstringprimitiv
e或REPNZstringprimitive指令功能:除退出条件为(CX/ECX)0或ZF1外,其他操作与REPE完全相同。也就是说,在每次比较时,只要两数比较的结果不相等(即ZF0),就继续执行串处理指令;如某次两数比较相等或(CX/E
CX)0,就结束操作。例如:REPMOVSB在执行这条指令之前,假设DF0,(SI)0020H,(DI)0100H,(CX)0030H。那么,这条带有重复前缀的串传送指令,将把数据段从0020H开始的30H个字节传送到当前附加段以0100H为起始地址的存储区中。如
果不用串操作指令,上述传送操作就需编制如下程序段:MOVSI,0020HMOVDI,0100HMOVCX,0030HLOP:MOVAL,[SI]MOVES:[DI],ALINCSIREPMOVSBINCDILOOPL
OP【例4-49】要求从一个字符串中查找一个指定的字符,可用指令REPNZSCASB。右图表示了预置及找到后的情况。从图中可以看出,(AL)中指定的字符为space(空格),其ASCII码为20H。开始比较时,因(DI)指定的
字符与(AL)不符合而不断往下比较,当(DI)1508H时,比较结果相符,因此ZF1,在修改(DI)值后指令停止比较而提前结束,此时(DI)是相匹配字符的下一个地址;(CX)是剩下还未比较的字符个数。所以根据(DI)和(CX)的值可以很方便地找到所
需查找的字符的位置。5.处理机控制类指令(1)标志位操作指令80x86提供了一组设置或清除标志位的指令,它们只影响本指令指定的标志,而不影响其他标志位。这些指令是无操作数指令,指令中未直接给出操作数的地址,但隐含指出操作数在某个标志位上。能直接操作
的标志位有CF、IF、DF。①清除进位标志指令(CLearCarryflag)CLC;置CF0。②进位标志置位指令(SeTCarryflag)STC;置CF1。③进位标志取反指令(CoMplementCarryflag)CMC;CF取反。④清除方向标
志指令(CLearDirectionflag)CLD;置DF0。⑤方向标志置位指令(SeTDirectionflag)STD;置DF1。⑥清除中断标志指令(CLearInterrupt-enableflag)CLI;置IF0。⑦中断标志置位指令(SeTInterrup
t-enableflag)STI;置IF1。上述指令只对指定标志位操作,而不改变其余标志位。(2)其他处理机控制指令NOP(NoOPeration)无操作。HLT(HmLT)停机。ESC(ESCape)换码。WAIT(WAIT)等待。LO
CK(LOCK)封锁。