版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
概述3.18X86/Pentium指令格式及尋址方式3.28086/8088指令系統(tǒng)3.380X86指令系統(tǒng)(略)注:重點(diǎn)掌握3.1節(jié)的尋址方式和3.2的指令系統(tǒng)3.1節(jié)的指令格式一般了解索引第三章80X86/Pentium指令系統(tǒng)2022/12/232參考教材《從8086到pentiumⅢ微型計(jì)算機(jī)及接口技術(shù)》
——馬維華科學(xué)技術(shù)出版社2000《80X86/pentium》微型計(jì)算機(jī)原理及應(yīng)用》
——吳寧電子工業(yè)出版社2000《80X86微型計(jì)算機(jī)原理及應(yīng)用》
——易仲芳電子工業(yè)出版社1995《宏匯編語(yǔ)言程序設(shè)計(jì)及應(yīng)用》
——傅德勝東南大學(xué)出版社1999《匯編語(yǔ)言程序設(shè)計(jì)》
——奚抗生航空工業(yè)出版社1994《
80386/486系統(tǒng)編程實(shí)踐》
——呂曉慶浙江大學(xué)出版社1993《IBM-PC匯編語(yǔ)言程序設(shè)計(jì)》
——沈美明溫冬嬋清華大學(xué)出版社19912022/12/233概述指令:由操作碼(OP)和操作數(shù)構(gòu)成。指令系統(tǒng):CPU所能執(zhí)行的各種指令的集合。操作碼:規(guī)定了指令的性質(zhì)。
如數(shù)據(jù)傳送,加減乘除等。操作數(shù):參加運(yùn)算的數(shù)或存放數(shù)據(jù)的地址單元。
參加運(yùn)算的數(shù)分為8位、16位以及32位,存放在寄存器或存貯器中。
存放數(shù)據(jù)的地址單元需要20位(24位或32位)。因此,指令用什么方式來(lái)尋找操作數(shù),是計(jì)算機(jī)設(shè)計(jì)中一個(gè)重要問(wèn)題,影響到CPU的運(yùn)行速度和效率。2022/12/234§3.18X86/Pentium指令格式及尋址方式3.1.180X86/Pentium指令格式3.1.2指令系統(tǒng)的尋址方式
◆尋址方式—尋找操作數(shù)的方法
◆有效地址—EA段內(nèi)偏移量
◆尋址方式舉例
◆轉(zhuǎn)移地址尋址2022/12/23580X86/Pentium系列CPU采用變字節(jié)的指令格式,由1~6個(gè)字節(jié)構(gòu)成一條指令(如圖3-1)一條指令可分為6個(gè)字段:字段1
是附加字段,字段2-6是基本字段。1
Prefix前綴字段:定義或修改指令的屬性。(1-4字節(jié))如段超越、重復(fù)操作、總線(xiàn)鎖定等。2
opcode操作碼字段:規(guī)定指令的性質(zhì),指明指令的操作。(1-2字節(jié))這是必不可少的字段。3.1.1指令格式2022/12/2363.1.1指令格式3
Modr/m和s-i-b尋址方式字段:規(guī)定寄存器/存儲(chǔ)器操作數(shù)的尋址方式(1+1字節(jié))。4
disp位移量字段:段內(nèi)位移量的大?。?,1,2,4字節(jié)組成)。5
data立即數(shù)字段:指明立即數(shù)的大小??蔀?,1,2,4字節(jié)。2022/12/237注:⑴一條指令中可以包含一個(gè)操作數(shù),也可有一個(gè)以上的操作數(shù),操作數(shù)越長(zhǎng),字節(jié)越多,占用空間越大,執(zhí)行時(shí)間越長(zhǎng)。⑵只涉及一個(gè)操作數(shù)的指令稱(chēng)為單操作數(shù)指令。其操作數(shù)可由本身提供,也可由指令隱含指出;對(duì)二個(gè)操作數(shù)的雙操作數(shù)指令,至少有一個(gè)操作數(shù)必須由寄存器指出(因?yàn)?0X86的M及I/O空間較大,直接指出一個(gè)內(nèi)存單元或一個(gè)I/O端口需要較多的位數(shù),而用寄存器編號(hào),則用很少的位數(shù)即可)。2022/12/238⑶對(duì)16位偏移量,在指令代碼中或存儲(chǔ)器存放中,低字節(jié)在前;高字節(jié)在后。⑷大部分指令的操作碼為一個(gè)字節(jié)。也有的指令為一個(gè)字節(jié),不僅包括操作碼,還隱含寄存器,形成單字節(jié)指令。這類(lèi)指令字節(jié)數(shù)最少,執(zhí)行速度最快,使用也最頻繁。注:2022/12/2393.1.2指令系統(tǒng)的尋址方式一.尋址方式——尋找操作數(shù)的方法操作數(shù)的存放位置有三種可能:1.操作數(shù)包括在指令中:指令中操作數(shù)部分就是操作數(shù)本身。(操作數(shù)存放在代碼段中)此時(shí),操作數(shù)也稱(chēng)為立即數(shù)。2.操作數(shù)包含在CPU的某個(gè)寄存器中:某個(gè)寄存器的編碼指明操作數(shù)(操作數(shù)在CPU中)。3.操作數(shù)存放在內(nèi)存中:操作數(shù)部分指明此操作數(shù)的存放地址(操作數(shù)在存儲(chǔ)器中)。2022/12/2310二.有效地址——EA段內(nèi)偏移量由于邏輯地址由段基值和段內(nèi)偏移量構(gòu)成(8086、8088CPU),或由段選擇子和偏移量構(gòu)成(80286以上的CPU),我們把偏移量也稱(chēng)為有效地址,用EA表示。2022/12/2311構(gòu)成EA的四個(gè)地址分量:EA=(基址寄存器)+[(變址寄存器)×比例因子]+位移量
構(gòu)成EA的四個(gè)地址分量:基址:16位CPU:BX、BP的內(nèi)容;
32位COU:任一個(gè)通用寄存器的內(nèi)容。變址:16位CPU:SI、DI的內(nèi)容;32位CPU:任一個(gè)通用寄存器(ESP除外)的內(nèi)容。比例因子:32位(386以上CPU)尋址方式中特有的。比例因子為1,2,4,8。位移量:8位或16位或32位的立即數(shù)。2022/12/2312例:位移量TAB=3000H,EBX=1000H,ECX=20H,則TAB[EBX+ECX*2+8]的有效地址EA?解:EA=EBX+ECX*2+8+TAB=1000H+20H*2+8+3000H=4048H2022/12/23131立即尋址2
寄存器尋址3
存儲(chǔ)器尋址
①直接尋址 ②寄存器間址 ③基址尋址 ④變址尋址 ⑤基址加變址 ⑥帶位移量的基址加變址 對(duì)32位尋址方式還有:
⑦比例變址 ⑧基址加比例變址 ⑨帶位移量的基址加比例變址三.尋址方式分析2022/12/2314以AL、AX及EAX清零為例即AL←0=00H=00000000B
AX←0=0000H=0000000000000000B
EAX←0=00000000H=0……0B
32個(gè)“0”
︸2022/12/2315
指令中的操作數(shù)部分就是操作數(shù)本身,與操作碼一起取到指令隊(duì)列中。在執(zhí)行時(shí)不需再訪(fǎng)問(wèn)存貯器,立即數(shù)可以是8位/16位或是32位。例: MOVAL,0;AL←0MOVAX,0;AX←0MOVEAX,0;EAX←0操作碼為MOV:傳送操作數(shù):目的為AL,AX,EAX;源為0。如:
圖3-2
1
立即尋址2022/12/23162寄存器尋址操作數(shù)存放在指令指出的寄存器中,可以是8位/16位或32位。對(duì)16位:AX、BX、CX、DX、SI、DI、SP、BP對(duì)8位:AH、AL、BH、BL、CH、CL、DH、DLMOVBX,0;BX←0MOVAX,BX;AX←BX=0顯然,寄存器尋址是CPU內(nèi)部操作,不需要訪(fǎng)問(wèn)總線(xiàn)周期,所以,指令的執(zhí)行速度快。2022/12/23173存儲(chǔ)器尋址對(duì)操作數(shù)是指明參加操作的數(shù)的地址即EA時(shí),這類(lèi)尋址都是存儲(chǔ)器尋址。隨著尋找EA的不同,存儲(chǔ)器尋址可分為:①直接尋址
②寄存器間接尋址③基址尋址
④變址尋址⑤基址加變址
⑥帶位移量的基址加變址對(duì)32位尋址方式還有:⑦比例變址⑧基址加比例變址⑨帶位移量的基址加比例變址2022/12/2318①直接尋址指令中直接給出操作數(shù)的有效地址EA。例:設(shè)DS=4000H,2000H單元開(kāi)始存放00H,00H。
MOVAL,[2000H];AL←[2000H]=00HP96圖3-32022/12/2319操作數(shù)的有效地址EA存放在SI、DI、BP、BX四個(gè)寄存器之一中。借用上例:
MOVBX,2000H;BX←2000HMOVAL,[BX];AL←[BX]=[2000H]=00H,EA=2000H
圖3-4②寄存器間址2022/12/2320對(duì)16位間址:BX、SI、DI為間址寄存器時(shí),DS為默認(rèn)段基址;BP為間寄存器時(shí),SS為默認(rèn)段基址。對(duì)32位間址:8個(gè)32位通用寄存器為間址R,除EBP、ESP外,都默認(rèn)為DS。圖3-5②寄存器間址2022/12/2321③基址尋址操作數(shù)的有效地址EA=基址R+位移量例:MOVBX,1000H;基址R為BX、BP之一MOVAL,1000H[BX];EA=BX+1000H=1000+1000H=2000H ;AL←[BX+1000H]=[2000H]=00H2022/12/2322
有效地址EA=變址R+位移量DISP即EA=方法同基址尋址,只是變址R為SI、DI之一④變址尋址SIDI+{8位位移量16位位移量2022/12/2323⑤基址加變址尋址EA=EA=基址R+變址R例:MOVBX,1000HMOVDI,1000HMOVAL,[BX][DI];EA=BX+DI=1000H+1000H=2000H ;AL←[EA]=[2000H]=00H﹛﹜﹛﹜+BXBPSIDI2022/12/2324⑥帶位移量的基址加變址尋址EA=如上例:MOVBX,800HMOVDI,1000HMOVAL,800H[BX][DI];AL←[800H+1000H+800H]=[2000H]=00H{BXBP}+{SIDI}+{8位位移量16位位移量}2022/12/2325⑦比例變址EA=[變址寄存器]×比例因子+位移量設(shè):TABLE=1000HMOVESI,400HMOVEAX,1000H[ESI×4]
;EAX←[ESI×4+TABLE]=[400H*4+1000H]=[2000H]=00000000H2022/12/2326⑧基址加比例變址EA=[基址R]+[變址R]×比例因子
MOVEBX,1000HMOVESI,800HMOVEAX,[EBX][ESI×2];EAX←[EBX+ESI×2]=1000H+800H×2=[2000H]=00000000HEA=2000H2022/12/2327⑨帶位移量的基址加比例變址EA=[基址R]+[變址R]×比例因子+位移量MOVEBX,1000HMOVESI,400HMOVEAX,800H[EBX][ESI×2];EAX←[EBX+ESI×2]=1000H+400H×2+800H=[2000H]=00000000HEA=2000H2022/12/2328注對(duì)存儲(chǔ)器尋址:R為BX、SI、DI或直接地址時(shí),默認(rèn)DS段;R為BP、SP時(shí),默認(rèn)SS段。非默認(rèn)段時(shí),由段超越寄存器指明。如ES:MOVCX,[BX]亦可寫(xiě)為MOVCX,ES:[BX];段基值由DS改為ES。(見(jiàn)表3-2)2022/12/2329例:設(shè)DS=2000H,[DS:2000H]=0
SS=1000H,[SS:2000H]=1BX=BP=2000HMOVAL,[BX];AL=[DS*10H+BX]=0MOVAL,[BP];AL=[SS*10H+BP]=1MOVAL,SS:[BX];AL=[SS*10H+BX]=1DS:MOVAL,[BP];AL=[DS*10H+BP]=0例3
設(shè)DS=2100H,SS=1000H,
CS=2000H,BX=0158H,DI=10A5H,DISP偏移量TABLE=1B57H,BP=1058H,求下列指令源操作數(shù)的有效地址EA和物理地址PA①M(fèi)OVAL,TABLE解1:直接尋址EA=TABLE=1B57H,PA=DS*10H+TBLE=2100H*10H+1B57H=22B57H②MOVAL,[BX]解2:寄存器間址
EA=BX=0158H,PA=DS*10H+EA=2100*10H+0158H=21158H例3
設(shè)DS=2100H,SS=1000H,
CS=2000H,BX=0158H,DI=10A5H,DISP偏移量TABLE=1B57H,BP=1058H,求下列指令源操作數(shù)的有效地址EA和物理地址PA③MOVAL,TABLE[BP]解:基址EA=BP+TABLE=1058H+1B57H=2BAFH,PA=SS*10H+EA=1000H*10H+2BAFH=12BAFH④MOVAL,TABLE[DI]解:變址EA=DI+TABLE=10A5H+1B57H=2BFCH,PA=DS*10H+EA=2100H*10H+2BFCH=23BFCH例3設(shè)DS=2100H,SS=1000H,
CS=2000H,BX=0158H,DI=10A5H,DISP偏移量TABLE=1B57H,BP=1058H,求下列指令源操作數(shù)的有效地址EA和物理地址PA⑤MOVAL,TABLE[BX][DI]解:帶位移量的基址加變址EA=BX+DI+TABLE=0158H+10A5H+1B57H=2D54HPA=DS*10H+EA=2100H*10H+2054H=23054H⑥MOVAL,CS:[BX]解:段超越EA=BX=0158HPA=CS*10H+EA=2000H*10H+0158H=20158H2022/12/2333四轉(zhuǎn)移地址尋址以上講了是有關(guān)數(shù)據(jù)的操作數(shù)尋址方式。我們知道:操作數(shù)是包括數(shù)據(jù)(操作數(shù)本身-立即尋址)和數(shù)據(jù)地址(通過(guò)EA尋址)兩部分構(gòu)成。在遇到轉(zhuǎn)移指令或調(diào)用指令時(shí)要確定轉(zhuǎn)向地址。這里我們介紹有關(guān)轉(zhuǎn)移地址的四種尋址方式轉(zhuǎn)移地址的四種尋址方式段內(nèi)直接尋址段內(nèi)間接尋址段間直接尋址段間間接尋址2022/12/23351段內(nèi)直接尋址:EA=IP+DISP(8/16位)由于此時(shí)是以IP為基址,DISP是相對(duì)IP的差值,故這是一種相對(duì)尋址方式,允許其在內(nèi)存中各個(gè)區(qū)域運(yùn)行,而不用改變指令,這符合程序的再定位要求。在條件轉(zhuǎn)移時(shí):DISP只允許8位在無(wú)條件轉(zhuǎn)移時(shí):8位的DISP稱(chēng)為短跳轉(zhuǎn)16位的DISP稱(chēng)為近跳轉(zhuǎn)2022/12/2336例:(匯編語(yǔ)言格式)JMPNEARPTRPROGIA;IP←IP+PROGIA(16B)JMPSHORTQUEST其中PROGIA和QUEST是偏移量的符號(hào)地址如是16位:DISP則符號(hào)地址前加操作符NEARPTR如是8位:DISP則符號(hào)地址前加操作符SHORT2022/12/23372段內(nèi)間接尋址EA={REGMEM}→IP∣→除立即數(shù)外的任一種數(shù)據(jù)尋址方式不能用于條件轉(zhuǎn)移,以下2種也是如此。而JMP和CALL不受限制。段內(nèi)間址轉(zhuǎn)移指令的匯編格式為例:JMPBX ;IP←BXJMPWORDPTR[BP+TABLE];IPL←[BP+TABLE],IPH←[BP+TABLE+1]其中WORDPTR為字操作符,表示其后的轉(zhuǎn)向地址是一個(gè)字的有效地址2022/12/2338指令中直接提供轉(zhuǎn)向地址和偏移地址
DISP→IP
段地址→CS
例:JMPFARPTRROUTINE;IP←DISP,CS←DISP所在段
3段間直接尋址:︸段間轉(zhuǎn)移的操作符︸轉(zhuǎn)向的符號(hào)地址DISP2022/12/23394段間間接尋址:用存貯器中二個(gè)相繼字的內(nèi)容來(lái)取代IP和CS寄存器中的原始內(nèi)容以達(dá)到級(jí)間轉(zhuǎn)移的目的。這里存貯單元地址是立即數(shù)和寄存器尋址方式外的任一種數(shù)據(jù)尋址方式例:JMPDWORDPTR[INTERS+BX]
;IP←[INTERS+BX]CS←[INTERS+BX]所在段基址
︸雙字操作符︸基址尋址2022/12/2340§3.28086/8088系統(tǒng)8086/8088指令系統(tǒng)可以分為6組:數(shù)據(jù)傳送類(lèi)指令
算術(shù)運(yùn)算指令邏輯運(yùn)算類(lèi)指令
控制轉(zhuǎn)移指令處理器控制類(lèi)指令
串處理類(lèi)指令
下面分別加以說(shuō)明。(有關(guān)指令符號(hào)見(jiàn)表3-3)2022/12/23413.2.1數(shù)據(jù)傳送類(lèi)指令數(shù)據(jù)傳送類(lèi)指令用于把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存貯單元(I/O)端口)中。它又分為四種:即:1通用數(shù)據(jù)傳送2I/O數(shù)據(jù)傳送3目標(biāo)地址數(shù)據(jù)傳送4標(biāo)志位數(shù)據(jù)傳送2022/12/2342一通用數(shù)據(jù)傳送8086/8088提供5條這類(lèi)指令:表3-4MOV ——
傳送PUSH——
入棧POP ——
出棧XCHG——
交換XLAT——
換碼(字節(jié)翻譯)2022/12/23431MOV指令:MOVOPRD1,OPRD2;OPRD1←OPRD2
↑
源操作數(shù)可以是Reg、Seg、MEM、im目的操作數(shù)可以是Reg、Seg(CS除外)、
MEM,不能是立即數(shù)。當(dāng)源是im時(shí),目的不能是Seg?!康脑床僮鲾?shù)從源傳送到目的2022/12/2344MOV指令形式MOVREG/SEG,REG;B/W,REG/SEG←REGMOVREG,SEG;W,REG←SEGMOVREG/SEG,MEM;B/W,REG/SEG←MEMMOVMEM,REG/SEG;B/W,MEM←REG/SEGMOVREG,IMM;B/W,REG←IMMMOVMEM,IMM;B/W,MEM←IMM2022/12/2345例:
①實(shí)現(xiàn)CPU內(nèi)部寄存器之間數(shù)據(jù)傳送:(CS和IP除外)MOVAL,BLMOVDL,CHMOVAX,DXMOVDS,AXMOVDX,ESMOVBX,DIMOVSI,BPMOVAX,DATA_SEGMOVDS,AX;段地址必須通過(guò)Reg→Seg…2022/12/2346例②實(shí)現(xiàn)立即數(shù)傳送至CPU內(nèi)部的通用Reg
(AX,BX,CX,DX,BP,SP,SI,DI)或MEM:MOVCL,4MOVAX,0000HMOVSI,057BHMOVAL,‘E’
;ASCII代碼‘E’(45H)ALMOVBYTEPTRABC,1;…2022/12/2347例③實(shí)現(xiàn)Reg和MEM(CS和IP除外)之間數(shù)據(jù)傳送:MOVAL,BUFFERMOVAX,[SI]MOV[DI],CXMOVSI,BLOCK[BP]MOVDS,DAT[SI+BX]MOVDEST[BP+DI],ESMOVBX,OFFSETTABLE;把TABLE的偏移地址而不是內(nèi)容送BX,OFFSET為屬性操作符?!?022/12/2348要實(shí)現(xiàn)MEM→MEM的數(shù)據(jù)傳送,必須借助于CPU的Reg:例:MOVAL,AREA1MOVAREA2,ALMOVAREA1,AREA2正確錯(cuò)誤}2022/12/2349注意:MOV指令使用時(shí)1、立即數(shù)IMM和段寄存器CS不能作為目的操作數(shù)。例MOV5,AX;5←AX,錯(cuò)
MOVCS,AX;CS←AX,錯(cuò)2、立即數(shù)不能直接傳送到段寄存器SEG。
例MOVDS,5;DS←5,錯(cuò)3、兩個(gè)存儲(chǔ)單元之間不能直接傳送數(shù)據(jù)。 例MOVMEM1,MEM2;MEM1←MEM22022/12/2350注意:MOV指令使用時(shí)4、兩個(gè)段寄存器之間不能直接傳送數(shù)據(jù)。例MOVDS,CS;DS←CS,錯(cuò)5、操作數(shù)類(lèi)型必須匹配。例MOVAX,BL;AX←BL,錯(cuò)
MOVCL,DX;CL←DX,錯(cuò)以上注意點(diǎn)對(duì)以后介紹的指令同樣適用。2022/12/23512堆棧操作:①堆?!凑招畔⒌南冗M(jìn)后出(后進(jìn)先出)原則組織的一段內(nèi)存區(qū)域。在80X86/Pentium中此區(qū)域用SS來(lái)指示堆棧段基址,用SP指針來(lái)指示堆棧地址的偏移量,SP始終指向堆棧的頂部,堆棧的初值SP可由MOVSP,IMM16指令來(lái)設(shè)定。低地址高地址出棧入棧SS:SP→2022/12/2352②堆棧的作用★首先,在調(diào)用子程序/中斷服務(wù)處理時(shí),需要暫停主程序的執(zhí)行,轉(zhuǎn)去執(zhí)行子程序/中斷服務(wù)程序,為了保證程序執(zhí)行完畢后能正確地返回到主程序,必須在調(diào)用時(shí)記錄下一條要執(zhí)行指令的地址(即CS和IP的值);★其次,在調(diào)用子程序/中斷服務(wù)程序時(shí),往往要用到Reg或影響到標(biāo)志位,為了保證返回時(shí)有關(guān)Reg或標(biāo)志位的正確,故也必須記下Reg及Flag的信息;★第三,在子程序嵌套或子程序遞歸的場(chǎng)合,要求能逐次返回上層子程序。2022/12/2353③堆棧操作指令:PUSH和POP都是16位操作;立即數(shù)不能直接如棧。ⅰ入棧:PUSHREG16;SP-1→SP,REG16H→[SP]SP-1→SP,REG16L→[SP]具體指令:PUSHREG16;W,SP←SP-2,[SP]←REG16PUSHSeg;W,SP←SP-2,[SP]←SegPUSHMEM16;W,SP←SP-2,[SP]←MEM16
}SP-2→SPOPRD→[SP]堆棧操作示意圖2022/12/2354ii出棧:POPREG16;[SP]→REG16LSP+1→SP[SP]→REG16HSP+1→SP具體指令:POPREG16;W,REG16←[SP],SP←SP+2POPSeg;W,Seg←[SP],SP←SP+2POPMEM16;W,MEM16←[SP],SP←SP+2[SP]→OPRDSP+2→SP}堆棧操作示意圖2022/12/23553.交換指令
XCHGOPRD1,OPRD2;OPRD1OPRD2
用于將源操作數(shù)和目的操作數(shù)(字或字節(jié))進(jìn)行交換OPRD:reg、MEM,但Seg不行。例:XCHGAX,REG;W,AXREGXCHGREG,MEM;B/W,REG MEM2022/12/2356例:XCHGBX,[BP+SI]設(shè)BX=6F30H,BP=0200H,SI=0046H,SS=2F00H,[2F246H]=4154H則指令執(zhí)行后:BX=4154HOPRD2的物理地址:2F000H+0200H+0046H=2F246H[2F246H]=6F30H2022/12/23574換碼指令XLAT;B;AL←[BX+AL]用于將一種代碼翻譯成另一種代碼有效地址EA=BX+AL,[EA]→ALAL為8位無(wú)符號(hào)數(shù):00H~FFH(0~255)2022/12/2358使用該指令,應(yīng)首先在DS段中預(yù)置一個(gè)表格,(長(zhǎng)度≤256B)表格起始地址的偏移量先送入BX,AL為查找對(duì)象在表中的偏移字節(jié)(與表首址之差)(主要用于查找一些無(wú)規(guī)則代碼)例:0~9的ASCII代碼查找DS=2000HBX=0800HAL=04EA=0800+04=0804H物理地址:20000+0804=20804H書(shū)上例BCD0~9→七段LED代碼見(jiàn)P83圖3-162022/12/23591、 8086系統(tǒng)規(guī)定,凡是遇到給SS賦值時(shí),系統(tǒng)自動(dòng)禁止外部中斷,直到下一條指令執(zhí)行后,才開(kāi)放中斷,以防止在修改SS、SP過(guò)程中,堆??臻g的混亂。2、通用傳送指令通常不改變標(biāo)志位。注意:2022/12/2360二I/O數(shù)據(jù)傳送
1、用于CPU和外設(shè)之間進(jìn)行數(shù)據(jù)交換;
2、包括IN/OUT指令,可以是字節(jié)或字I/O;
3、指令中指定AL或AX與外設(shè)端口交換信息;
4、端口地址為一字節(jié)即0~255(00~FFH)時(shí),可直接尋址,亦可間接尋址;對(duì)端口地址為兩字節(jié),即256~65535(0100H~FFFFH)時(shí),只能間接尋址;
5、間址寄存器只能用DX。2022/12/23611輸入指令:
INAL,n;B,AL←[n]INAX,n;W,AL←[n],AH←[n+1]INAL,DX;B,AL←[DX]INAX,DX;W,AL←[DX],AH←[DX+1]2輸出指令:OUTn,AL;B,[n]←ALOUTn,AX;W,[n]←AL,[n+1]←AHOUTDX,AL;B,[DX]←ALOUTDX,AX;W,[DX]←AL,[DX+1]←AH2022/12/2362例:INAL,21H/INAX,21HMOVDX,210HINAL,DX/INAX,DXMOVDX,261HOUTDX,ALMOVAX,1234HOUT22H,AX;[22H]←34H[23H]←12H2022/12/2363三目標(biāo)地址傳送亦稱(chēng)為有效地址計(jì)算指令(見(jiàn)P76表3-7)。共3條與MOV指令的區(qū)別在于不是傳送變量本身,而是傳送變量的有效地址EA,這樣,就不必用軟件計(jì)算EA。1、
EA送Reg指令
LEAREG16,MEM;W,REG←ADDRMEM以下是四字節(jié)(雙字)傳送指令:2、指針?biāo)蚏eg和DS指令:*隱含DS,
LDSReg,MEM;DW,REG16←[EA],DS←[EA+2]3、指針?biāo)蚏eg和ES指令:*隱含ES
LESReg,MEM;DW,REG16←[EA],ES←[EA+2]*LDS和LES的區(qū)別只是SEG不同而已。2022/12/23644、例:①LEABX,0F62H[BX][SI]設(shè)BX=0400H,SI=003CH指令執(zhí)行后
BX=0400H+003CH+0F62H=139EH
*注意:這里BX得到的是EA而不是[EA]②
LDSSI,[10H]設(shè)DS=C000H,DS:10=0180H,DS:12=2000H,執(zhí)行后,SI=0180H,DS=2000H如圖:80H01H00H20HLES只是[EA+2]→ES而不是DSDS:0010DS:0012DS:C000H執(zhí)行后SI=0180HDS=200H2022/12/2366四標(biāo)志位傳送用于狀態(tài)保護(hù)或恢復(fù)。(共四條,見(jiàn)P79表3-6)單字節(jié)指令,無(wú)操作數(shù)(隱含)
1讀標(biāo)志指令OFDFIFTFSFZFAFPFCFFregAHLAHF;AH←FRL;主要兼容8BCPU2022/12/2367
2
設(shè)置標(biāo)志指令
SAHF;FRL←AH;
同上功能與LAHF相反,恢復(fù)FRL的狀態(tài)。
3/4標(biāo)志位入棧/標(biāo)志位出棧指令
PUSHF/POPF;[SP]←FR,SP←SP-2/FR←[SP],SP←SP+2FR的內(nèi)容進(jìn)/出棧指令,用于中斷/子程序調(diào)用時(shí),保護(hù)/恢復(fù)FR的內(nèi)容,或用于改變TF(跟蹤)狀態(tài)。2022/12/2368例P78PUSHFPOPAXORAX,0100H;使D8=1(TF)PUSHAXPOPF2022/12/23693.2.2算術(shù)運(yùn)算類(lèi)指令一、算術(shù)運(yùn)算指令涉及的問(wèn)題1數(shù)據(jù)類(lèi)型
算術(shù)運(yùn)算類(lèi)指令主要涉及兩種類(lèi)型的數(shù)據(jù)即無(wú)符號(hào)數(shù)和有符號(hào)數(shù):
對(duì)8位有符號(hào)數(shù)的范圍:-128~+127對(duì)8位無(wú)符號(hào)數(shù)的范圍:0~255對(duì)16位無(wú)符號(hào)數(shù)的范圍:0~65535對(duì)16位無(wú)符號(hào)數(shù)的范圍:-132768~327672022/12/2370對(duì)壓縮BCD碼的范圍:
0~99(每四位→一個(gè)十進(jìn)制數(shù))對(duì)非壓縮BCD碼的范圍:
0~9(每8位→一個(gè)十進(jìn)制數(shù))
10011001→99(壓縮)
00001001→9(非壓縮)對(duì)加/減運(yùn)算:86采用同一套指令
對(duì)乘/除運(yùn)算:帶符號(hào)數(shù)和無(wú)符號(hào)數(shù)的運(yùn)算采用的指令不同2022/12/23712運(yùn)算標(biāo)志通常算術(shù)指令都會(huì)影響狀態(tài)標(biāo)志F
如:無(wú)符號(hào)數(shù)運(yùn)算進(jìn)位CF=1
有符號(hào)數(shù)運(yùn)算溢出OF=1
運(yùn)算結(jié)果為0,ZF=1
運(yùn)算結(jié)果為負(fù),SF=1
運(yùn)算結(jié)果為偶,PF=1(低8位)這些標(biāo)志通常決定程序的流程。算術(shù)運(yùn)算指令共有20條見(jiàn)P87表3-52022/12/2372二、加/減運(yùn)算8086/8088的加/減運(yùn)算指令共有12條1.ADDCPRD1,OPRD2SUBCPRD1,OPRD2;OPRD1←OPRD1±OPRD2指令格式:ADD/SUBreg,reg;B(W),reg←reg±regADD/SUBreg,mem;B(W),reg←reg±m(xù)emADD/SUBreg,imm;B(W),reg←reg±immADD/SUBmem,reg;B(W),mem←mem±regADD/SUBmem,imm;B(W),mem←mem±imm2022/12/2373關(guān)于加/減運(yùn)算的例子見(jiàn)P87
設(shè)AX=65AOH,BX=B79EH執(zhí)行ADDAX,BX
0110010110100000+101101111001111010001110100111110有進(jìn)位CF=1最高位D15=0SF=0Cs⊕Cp=1⊕1=0OF=0 結(jié)果非零ZF=0D3D4無(wú)進(jìn)位,AF=0低8位為5個(gè)1,PF=02022/12/2374指令執(zhí)行后,AX=1D3EH.FR:CF=1,SF=0,OF=0,ZF=0,AF=0,PF=0對(duì)AF標(biāo)志是由調(diào)整指令(如DAA)使用的,編程者一般不予考慮。對(duì)運(yùn)算結(jié)果分析:如AX,BX為無(wú)符號(hào)數(shù),則結(jié)果>65535(CF=1);如AX,BX為帶符號(hào)數(shù),則結(jié)果在16位補(bǔ)碼所能表示的范圍內(nèi)因而運(yùn)算結(jié)果正確(1D3EH)。
上例AX,BX,如執(zhí)行SUBAX,BX,則 0110010110100000+01001000011000101010111000000010[B79EH]變補(bǔ)*無(wú)進(jìn)位→有借位CF=1D15=1→SF=1CS⊕CP=0+1=1→OF=1AX=AE02H*結(jié)果非0→ZF=0無(wú)進(jìn)位→有借位,AF=1低8位一個(gè)1,PF=0低8位一個(gè)1,PF=0分析2022/12/2376這是帶進(jìn)/借位的加/減法指令
單精度——16位運(yùn)算 雙精度——32位運(yùn)算多精度——32位以上運(yùn)算帶進(jìn)/借位的加/減指令主要用來(lái)進(jìn)行多精度運(yùn)算。ADC/SBBreg,src;reg←reg±src±CFADC/SBBa,imADC/SBBdst,immADC/SBBdst,reg2ADC/SBB2022/12/2377通常,在多精度(雙)運(yùn)算時(shí),最低字節(jié)用ADD/SUB指令,在其它高位字節(jié)都用ADC/SBB指令例
DXAX+BXCX設(shè)DX=0002HAX=OF365H BX=0005HCX=OE024H指令:
ADDAX,CXADCDX,BX2022/12/2378首先:
F365
+E024D389其次:
0002
+0005
+1
0008DX=0008SF=0ZF=0CF=0OF=0
進(jìn)位1——←AX=00389HSF=1ZF=0CF=1OF=02022/12/23793
增/減量指令:
INCOPRDDECOPRD
主要用來(lái)對(duì)指定操作數(shù)±1,常見(jiàn)于修改循環(huán)地址指針和計(jì)數(shù)次數(shù)。指令格式:
INCr;B/W,r←r+1DECr;B/W,r←r-1INCsrc;B/W,src←src+1DECsrc;B/W,src←src-1注意:不影響CF標(biāo)志;OPRD←OPRD±12022/12/23804取補(bǔ)指令:NEGOPRD;OPRD←OPRD+1NEGr;B/W,R←0-RNEGsrc;SRC←0-SRC2022/12/23815比較指令:CMPOPRD1,OPRD2;OPRD1-OPRD2比較指令不影響源和目的操作數(shù),但影標(biāo)志位。指令格式: CMPr,src;r-src CMPa,im;a-im CMPdst,r;dst-r CMPdst,im;dst-im2022/12/2382比較指令,顧名思義,即進(jìn)行兩個(gè)數(shù)的大小比較1對(duì)相等的兩數(shù),僅測(cè)ZF標(biāo)志2對(duì)無(wú)數(shù)符數(shù),用CF標(biāo)志3對(duì)帶符號(hào)數(shù),比較復(fù)雜,不能簡(jiǎn)單由SF或OF來(lái)判斷,而必須根據(jù)SF⊕OF來(lái)確定。2022/12/2383小結(jié)符號(hào)結(jié)果OFSFZFCF無(wú)A≥BA<B01有A≥BA<B00111001}OF⊕SF=0A≥B}OF⊕SF=1A<B2022/12/23846
BCD碼調(diào)整指令A(yù)AA,DAAAAS,DASAAA/AAS非壓縮(非組合)BCD碼加/減調(diào)整,DAA/DAS壓縮(組合)BCD碼加/減調(diào)整。}調(diào)整指令功能:DAA/DAS:若L∩OFH>P∪AF=1則AL←AL±6CF←AF若AL>9FH或CF=1AL←AL±60HCF←12022/12/2385例:1834+2789
ALCFAFMOVAL,34H;34H00ADDAL,89H;BDH00DAA;23H 10MOVBL,AL;23H10MOVAL,18H;18H10ADCAL,27H;40H01DAA;46H00MOVBH,AL;46H002022/12/2386AAA/AAS; AL←AL±6非壓縮BCD AH←AH+1 AF←1 CF←1 AL←AL∩OF例7+5 00000111+00000101 1100 +0110AL=00010010 ∩00001111 00000010←AL 00000000 +1 00000001→AHAX=0102H→122022/12/2388三乘/除運(yùn)算
在86系統(tǒng)中,因增加了乘/除運(yùn)算邏輯部件,因而可直接進(jìn)行乘/除運(yùn)算。這是較8BCPU(如Z80等)先進(jìn)之處之一。1乘法運(yùn)算①M(fèi)ULOPRD;無(wú)符號(hào)數(shù)乘法運(yùn)算 IMULOPRD;帶符號(hào)數(shù)乘法運(yùn)算
2022/12/2389②兩個(gè)8位數(shù)相乘,會(huì)得到一個(gè)16位的乘積,兩個(gè)16位數(shù)相乘,會(huì)得到一個(gè)32位的乘積。
故乘法運(yùn)算時(shí),只指明一個(gè)操作數(shù),另一個(gè)隱含在AL(8位)或AX(16位)中:8位數(shù)相乘→結(jié)果在AX中 16位數(shù)相乘→結(jié)果在DX,AX中③乘法運(yùn)算影響Freg的CF、DF,其它標(biāo)志不確定AH(DX)≠0→CF=1OF=1,否則都為0(IMUL時(shí)稍有不同,是低位符號(hào)的擴(kuò)展)。2022/12/2390④指令格式:
MULsrc;B,AX←AL*srcIMULsrc;W,DX,AX←AX*src例:MULBL;B,AX←AL*BLMULCX;W,DXAX←AX*CX MULBYTEPTR[SI];AX←AL*[SI] MULWORDPTR[DI];DXAX←AX*[DI+1][DI]
對(duì)有符號(hào)數(shù)運(yùn)算,將MUL改為IMUL2022/12/2391⑤MUL和IMUL區(qū)別例3*(-2)=-63*14=42(2AH)∣→[1110]補(bǔ)∣→1110故3*(-2)和3*14都成了0011*1110=2AH2AH這個(gè)結(jié)果對(duì)3*14是正確的對(duì)3*(-2)是錯(cuò)誤的豎式:0011×111000101010=2A另一種算法:先計(jì)算3*2=6,再求補(bǔ)碼(IMUL)豎式:
0011 × 001000000110
求補(bǔ)11111010求補(bǔ)FA-6此結(jié)果對(duì)3*(-2)是正確的對(duì)3*14是錯(cuò)誤的∴要想得到無(wú)/有符號(hào)數(shù)每次法運(yùn)算的正確結(jié)果,必須分別進(jìn)行無(wú)/有符號(hào)數(shù)的乘法運(yùn)算。這就是MUL/IMUL的來(lái)歷和執(zhí)行過(guò)程。乘法運(yùn)算是如此,除法運(yùn)算也相同。2022/12/23932除法運(yùn)算DIVOPRD;IDIVOPRD;
ALAH余商AXDX2022/12/2394①無(wú)/帶符號(hào)數(shù)除法運(yùn)算:DIVsrc;B,AL←AX/src的商
AH←AX/src的余數(shù) ;W,AX←DXAX/src的商
DX←DXAX/src的余數(shù)
對(duì)帶符號(hào)數(shù):IDIVsrc,其操作同DIV,只是src是帶符號(hào)的,商和余數(shù)也為帶符號(hào)數(shù),且余數(shù)的符號(hào)與被除數(shù)相同2022/12/2395②除法運(yùn)算的符號(hào)擴(kuò)展為了便于進(jìn)行8位/16位的除法運(yùn)算,其被除數(shù)常常設(shè)計(jì)為16位/32位。為此,86指令系統(tǒng)中設(shè)計(jì)了二條符號(hào)擴(kuò)展指令
CBW——字節(jié)轉(zhuǎn)換為字指令 ;AL的內(nèi)容符號(hào)擴(kuò)展到AH即AL的D7=0→AH=00HAL的D7=1→AH=0FFHD7AHAL2022/12/2396同理CWD——字轉(zhuǎn)換為雙字指令;AX的內(nèi)容符號(hào)擴(kuò)展到DX即AX的D15=0→DX=0000HAX的D15=1→DX=0FFFFHD15DXAX2022/12/2397③除法運(yùn)算的溢出除法運(yùn)算,在字節(jié)操作時(shí),要求商為8b。當(dāng)8b操作時(shí),被除數(shù)高8b的絕對(duì)值>除數(shù)的絕對(duì)值;或16b操作時(shí),被除數(shù)高16b的絕對(duì)值>除數(shù)的絕對(duì)值,商就會(huì)產(chǎn)生溢出,IBMPC機(jī)中設(shè)計(jì)為0型中斷處理。為避免除法溢出,程序在設(shè)計(jì)時(shí)應(yīng)考慮溢出判斷及處理。2022/12/2398④例⑴設(shè)AX=0400HBL=0B4H=1024(無(wú))+1024(帶)=180(無(wú))-76(帶)執(zhí)行DIVBL的結(jié)果是:;AL=05H=5(商);AH=7CH=124(余數(shù))執(zhí)行IDIVBL的結(jié)果是:;AL=0F3H=-13(商);AH=24H=36(余數(shù))2022/12/2399AXBLDIVIDIV0400H0B4HAH(余)AL(商)AH(余)AL(商)10241801245+1024-7636-132022/12/23100⑵計(jì)算(V-(X*Y+Z-540))/X設(shè)X、Y、Z、V均為16b帶符號(hào)數(shù),且已分別裝入X、Y、Z、V單元,要求上式計(jì)算結(jié)果的商存于AX,余數(shù)存入DXMOVAX,x;IMULy;X*YMOVCX,AXMOVBX,DX;BX,CX←X*YMOVAX,ZCWD;Z擴(kuò)展為32b2022/12/23101ADDCX,AXADCBX,DX;X*Y+Z→BX,CXSUBCX,540SBBBX,0;X*Y+Z-540→BX,CXMOVAX,VCWD;V擴(kuò)展為32bSUBAX,CXSBBDX,BX;V-(X*Y+Z-540)→DX,AXIDIVX;DX,AX/X→DX,AX余數(shù)商2022/12/231023非組合BCD的乘/除調(diào)整指令A(yù)AM;緊跟MUL指令后;(AX←把AL中的積調(diào)整到非壓縮的BCD格式)AH←AL/10(0AH)的商
AL←AL/10(0AH)的余數(shù)AAD;緊接DIV指令前;(被除數(shù)AX)AL←AH*10(0AH)+ALAH←02022/12/23103AL=00001001=09H;BL=09HMULBLAX=0000000001010001=0051HAAMAX=0000100000000001=(0801H)=81例:①9*9AHAL非壓縮BCD2022/12/23104例②設(shè)被除數(shù)6262/7AX=0000011000000010B;BL=7AADAX=0000000000111110BDIVBLAX=0000011000001000B=0608HAAM/AAD影響PF、SF、CF余數(shù)商2022/12/231053.2.3邏輯運(yùn)算與移位類(lèi)指令用于處理字或字節(jié)中數(shù)據(jù)位的信息。包括邏輯運(yùn)算、移位(循環(huán)移位)指令部分一.
邏輯運(yùn)算指令
見(jiàn)P88表3-10:
NOT、AND、OR、XOR、TEST
所有指令均為按位操作(8/16B)段寄存器不能進(jìn)行邏輯運(yùn)算主要用來(lái)組合、屏蔽、取反和測(cè)試操作數(shù)的某些位。2022/12/23106邏輯非: NOTOPRD(例NOTAX);OPRD←OPRD邏輯與:
ANDdst,src;dst←dst∩src
例:ANDAL,0F0H;AL←AL∩0F0H邏輯或:
ORdst,src;dst←dst∪src
例:ORBL,AL;BL←BL∪AL邏輯異或:XORdst,src;dst←dst⊕src例:XORBX,CX;BX←BX⊕CX2022/12/23107邏輯測(cè)試:
TESTOPRD1,OPRD2;OPRD1∩OPRD2
例:TESTAL,10000000B;不保留調(diào)試結(jié)果,但通過(guò)FR反映其狀態(tài)。以上5條指令NOT不影響F.Reg.其它四條總使OF=CF=0,而PF、SF、ZF則根據(jù)運(yùn)算結(jié)果設(shè)置。應(yīng)用舉例: 1、用AND指令:屏蔽Di→置0,不變Di→置1。屏蔽D0、D1位:INAL,20H ANDAL,0FCH;(11111100B)2022/12/231082.用OR指令:組合Di→置1,不變Di→置0。組合D5位:
MOVAL,43H;01000011ORAL,20H;∪00100000011000112022/12/231093、用TEST指令:測(cè)試Di→置1
屏蔽Di→置0MOVAL,40HTESTAL,0AFH01000000∩1010111100000000MOVDL,ALTESTDL,00000010BJNZexit;測(cè)D1位是否為1這里要求測(cè)試D0、D1、D2、D3、D5、D7位是否為0,根據(jù)test的結(jié)果CF=OF=0,SF=0、ZF=1說(shuō)明測(cè)試位全為0,如后跟條件轉(zhuǎn)移指令即可進(jìn)行不同處理。2022/12/231104、用XOR指令:取反Di→置1,
不變Di→置0MOVAL,11HXORAL,3000100010000001100010010;D0、D1位取反XOR指令還可用來(lái)測(cè)試某一操作數(shù)是否與另一確定數(shù)相等,常用在檢查地址是否匹配時(shí)用。⊕2022/12/23111XORAX,042EHJZMATCH;AX=042EH,轉(zhuǎn)MATCHXORAX,AX;AX←0000H,CF=0移位和循環(huán)2022/12/23113移位和循環(huán)2022/12/23114說(shuō)明:1目標(biāo)操作數(shù)可以是8B或16B2計(jì)數(shù)值決定移位或循環(huán)次數(shù)計(jì)數(shù)值為1時(shí)常用im表示 計(jì)數(shù)值>1時(shí)必需用CL表示 計(jì)數(shù)值≤2553通常左/右移對(duì)應(yīng)乘/除2n有符號(hào)數(shù)除2n→SAR(算術(shù)右移)無(wú)符號(hào)數(shù)除2n→SHR(邏輯右移)2022/12/23115例1:AX*5/2MOVDX,AXSALAX,1;AX*2SALAX,1;AX*4ADDAX,DX;AX*5SARAX,1;AX*5/22022/12/231163.2.4控制轉(zhuǎn)移類(lèi)指令控制轉(zhuǎn)移類(lèi)指令包括四部分:
轉(zhuǎn)移指令:
JMP/Jx
重復(fù)操作:
LOOP
調(diào)用/返回:CALL/RET
中斷:INTn/IRET
在86/88CPU中,CS和IP決定程序的執(zhí)行順序。
當(dāng)程序發(fā)生轉(zhuǎn)移時(shí),實(shí)際上是把新值賦給CS和IP,下面一一討論8086/8088控制轉(zhuǎn)移的指令。2022/12/23117一轉(zhuǎn)移指令:轉(zhuǎn)移指令分為二類(lèi):在段內(nèi)直接轉(zhuǎn)移時(shí),分為短轉(zhuǎn)移和近轉(zhuǎn)移,即IP←IP+DISP(8/16b)SHORT(短轉(zhuǎn)移):若DISP在JMP指令的-128~+127字節(jié)內(nèi),匯編程序就自動(dòng)產(chǎn)生一個(gè)二字節(jié)指令。
NEAR(近轉(zhuǎn)移):若DISP不在短轉(zhuǎn)移的范圍內(nèi),就在±32K范圍內(nèi)尋找目標(biāo)地址,匯編程序就自動(dòng)產(chǎn)生一個(gè)三字節(jié)指令。段內(nèi)直接轉(zhuǎn)移:JMP1000H;IP←IP+1000H段內(nèi)間接轉(zhuǎn)移:JMPCX;IP←CXJMPWORDPTR[BX]段間直接轉(zhuǎn)移:JMP2000:0100H段間間接轉(zhuǎn)移:JMPDWORDPTR[SI]1無(wú)條件轉(zhuǎn)移2022/12/23118段內(nèi)間接轉(zhuǎn)移:IP←[Reg、MEM]段間轉(zhuǎn)移指令:改變CS和IP段間直接轉(zhuǎn)移:指令中給出新的CS和IP值段間間接轉(zhuǎn)移:根據(jù)計(jì)算出的EA值找出連續(xù)四個(gè)地址單元的內(nèi)容為IP和CS的新值即:IP←[EA+1,EA] CS←[EA+3,EA+2]2022/12/231192條件轉(zhuǎn)移共18條見(jiàn)P116表3.2條件轉(zhuǎn)移指令
其特征為:2字節(jié)的SHORTJMP(-128~+127)=>相對(duì)IP的JMP即e-2=>e=-126~+129助記符不唯一。JE/JZJA/JNBE測(cè)試5個(gè)狀態(tài)標(biāo)志:CF、ZF、OF、SF、PF條件轉(zhuǎn)移指令歸納起來(lái)分為三類(lèi):①單個(gè)標(biāo)志:表中1~10。根據(jù)某個(gè)標(biāo)志的狀態(tài)來(lái)決定轉(zhuǎn)移(5個(gè)標(biāo)志10條指令)2022/12/23120②無(wú)符號(hào)數(shù):表中11~14根據(jù)CF和ZF的狀態(tài)來(lái)決定轉(zhuǎn)移③帶符號(hào)數(shù):表中15~18根據(jù)SF、OF和ZF的狀態(tài)來(lái)決定轉(zhuǎn)移為什么要分帶符號(hào)數(shù)和無(wú)符號(hào)數(shù)呢?因?yàn)槠錅y(cè)試狀態(tài)不同(CF、ZF/SF、DF、ZF)例01H和0FEH這兩個(gè)數(shù)作為無(wú)符號(hào)數(shù)01H<0FEH作為帶符號(hào)數(shù)01H>0FEH(-2)2022/12/23121∴執(zhí)行下列指令:
MOVAL,01H CMPAL,0FEH后,CF=1,OF=0,SF=0,ZF=0若要求AL中無(wú)符號(hào)數(shù)>0FEH轉(zhuǎn)移時(shí),必須使用JA∵(CF=1∩ZF=0)∴不轉(zhuǎn)移(AL<0FEH)若要求AL中的帶符號(hào)數(shù)>0FFH轉(zhuǎn)移時(shí),必須使用JG∵(SF⊕OF=0∩ZF=0)∴轉(zhuǎn)移(AL>0FEH)2022/12/23122通常,條件轉(zhuǎn)移指令與CMP一起配合使用CMP無(wú)符號(hào)帶符號(hào)目>源JAJG目=源JE/JZJE/JZ目≠源JNEJNE目<源JBJL目≤源JBEJLE目≥源JAEJGE2022/12/23123例
①ADDAL,AL JCTOOBG;CF=1,轉(zhuǎn)TOOBG
…TOOBG:②SUBAL,BL(CMPAL,BL)JZZERO (JEZERO);ZF=1,轉(zhuǎn)ZERO
…ZERO: ③CMPBX,AXJABXM;CF=0且ZF=0轉(zhuǎn)BXM(無(wú)符號(hào)數(shù))
…
BXM:………2022/12/23124④比較AL>=、<10CMPAL,10JAEAE10
… ;A<10AE10:JAA10
… ;A=10A10: ;A>10……2022/12/23125例:設(shè)2000H開(kāi)始的區(qū)域中,存放著20個(gè)數(shù)據(jù),要求找出其中最大的一個(gè)數(shù),并存到2000H單元中。GATMAX: MOVBX,2000H;BX←2000H MOVAL,[BX];AL←第一個(gè)數(shù)
MOVCX,19;CX←計(jì)數(shù)值20P1:INCBX;BX指向下個(gè)數(shù)
CMPAL,[BX];和下個(gè)數(shù)比較
JAEP2;AL≥[BX]轉(zhuǎn)P2 MOVAL,[BX];AL<[BX],則AL←[BX]P2:DECCX;計(jì)數(shù)-1→CX JNZP1 ;CX≠0,轉(zhuǎn)P1 MOV[2000H],AL;CX=0,比較完,BX←2000H2022/12/23126
利用一條指令來(lái)控制程序的循環(huán)操作。共有4條:
LOOP
;CX←CX-1,CX≠0,轉(zhuǎn)移LOOPZ/LOOPE;CX←CX-1,CX≠0∩ZF=1,轉(zhuǎn)移
LOOPNZ/LOOPNE;CX←CX-1,CX≠0∩ZF=0,轉(zhuǎn)移
JCXZ
;CX=0,轉(zhuǎn)移二重復(fù)控制類(lèi)指令:Click2022/12/23127
重復(fù)控制指令使程序簡(jiǎn)練如:MOVCX,n MOVCX,nBEGIN:LOOPZ/LOOPELOOPNZ/LOOPNE:功能同LOOP,增加限制循環(huán)條件(ZF)。
注意:ZF的建立非CX所為,而是前面指令執(zhí)行結(jié)果。JCXZ:只是簡(jiǎn)單根據(jù)CX=0轉(zhuǎn)移,有的書(shū)把其放在條件轉(zhuǎn)移指令中。
LOOPBEGIN;CX←CX-1
……等效循環(huán)體===>……循環(huán)體DECCXJNZBEGIN…BEGIN:…2022/12/23128例:有一個(gè)L個(gè)字符的字符串存儲(chǔ)于首址為ASCII_STR的存儲(chǔ)區(qū)中。現(xiàn)要求在字符串中查找“空格”(ASCII碼為20H)字符,找到則繼續(xù)執(zhí)行,未找到則轉(zhuǎn)到not_found去執(zhí)行,編制實(shí)現(xiàn)這一要求的程序如下:2022/12/23129MOVCX,L;putarrayincxMOVSI,-1 ;initializeindex,andMOVAL,20H;MOVAL,“”;putcodefor;spaceinALNEXT:INCSI;increamentindexCMPAL,ASCII_STR[SI];TextforspaceLOOPNZNEXT;loopifnotspaceandcount;innonzeroJNZNOT_found;branchtoNOT_Found
Not_found:……2022/12/23130在程序執(zhí)行過(guò)程中,有兩種可能:①查找到“space”,此時(shí)提前結(jié)束循環(huán)(ZF=1),而順序繼續(xù)執(zhí)行②未查找到“space”,此時(shí)因CX=0,而結(jié)束循環(huán),JNZ條件滿(mǎn)足,(是執(zhí)行CMP指令的結(jié)果?。┒D(zhuǎn)到not_found去執(zhí)行。 在繼續(xù)執(zhí)行時(shí),可打印出找到“space”,以及“space”的位置;在執(zhí)行not_found時(shí),可打印未找到“space”的信息。2022/12/23131三調(diào)用/返回指令模塊化程序設(shè)計(jì)子程序?qū)⒁恍┚哂歇?dú)立功能的部分程序編寫(xiě)成獨(dú)立的程序模塊調(diào)用過(guò)程CALLPROC_A
CALLPROC_A……PROC_ARET……2022/12/23132該指令執(zhí)行的操作是:SP←SP-2,[SP+1,SP]←IP;IP入棧IP←IP+16位位移量
;轉(zhuǎn)向子程序入口
該指令執(zhí)行的操作是:SP←SP-2,[SP+1,SP]←CS;CS入棧SP←SP-2,[SP+1,SP]←IP;IP入棧IP←偏移地址EA;IP由指令中的偏移地址取代CS←段地址;CS由指令中的段地址取代該指令執(zhí)行的操作是:SP←
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 聘請(qǐng)專(zhuān)家的協(xié)議書(shū)(2篇)
- 南京航空航天大學(xué)《電離輻射探測(cè)學(xué)》2021-2022學(xué)年期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《涉稅服務(wù)實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 多變的顏色說(shuō)課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《計(jì)算機(jī)組成原理與匯編語(yǔ)言》2021-2022學(xué)年期末試卷
- 《小青蛙找家》說(shuō)課稿
- 南京工業(yè)大學(xué)《藥劑學(xué)實(shí)驗(yàn)》2021-2022學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)《數(shù)學(xué)模型與數(shù)學(xué)軟件》2021-2022學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)《深度學(xué)習(xí)應(yīng)用技術(shù)》2022-2023學(xué)年期末試卷
- 南京工業(yè)大學(xué)《綠色交通》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024中考語(yǔ)文《儒林外史》歷年真題專(zhuān)練(學(xué)生版+解析版)
- 小學(xué)必背古詩(shī)練習(xí)題(四年級(jí)上冊(cè))(含答案)
- DL∕T 698.45-2017 電能信息采集與管理系統(tǒng) 第4-5部分:通信協(xié)議-面向?qū)ο蟮臄?shù)據(jù)交換協(xié)議
- 2021年11月廣州市增城區(qū)(衛(wèi)生類(lèi))招聘考試《護(hù)理學(xué)》試卷
- 登革熱診療方案(衛(wèi)健委2024年版)
- 2024中國(guó)海油應(yīng)屆畢業(yè)生招聘筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 2024版借用公司名義簽訂合同協(xié)議
- 2024年國(guó)家知識(shí)產(chǎn)權(quán)局商標(biāo)審查協(xié)作中心招聘60人【重點(diǎn)基礎(chǔ)提升】模擬試題(共500題)附帶答案詳解
- 失智失能老年人的飲食照護(hù)(失智失能老人健康照護(hù)課件)
- 2025年中考數(shù)學(xué)專(zhuān)題09 逆等線(xiàn)最值專(zhuān)題(原卷版)
- 短視頻服務(wù)合同范本
評(píng)論
0/150
提交評(píng)論