




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
概述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《宏匯編語言程序設(shè)計(jì)及應(yīng)用》
——傅德勝東南大學(xué)出版社1999《匯編語言程序設(shè)計(jì)》
——奚抗生航空工業(yè)出版社1994《
80386/486系統(tǒng)編程實(shí)踐》
——呂曉慶浙江大學(xué)出版社1993《IBM-PC匯編語言程序設(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位)。因此,指令用什么方式來尋找操作數(shù),是計(jì)算機(jī)設(shè)計(jì)中一個重要問題,影響到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個字節(jié)構(gòu)成一條指令(如圖3-1)一條指令可分為6個字段:字段1
是附加字段,字段2-6是基本字段。1
Prefix前綴字段:定義或修改指令的屬性。(1-4字節(jié))如段超越、重復(fù)操作、總線鎖定等。2
opcode操作碼字段:規(guī)定指令的性質(zhì),指明指令的操作。(1-2字節(jié))這是必不可少的字段。3.1.1指令格式2022/12/2363.1.1指令格式3
Modr/m和s-i-b尋址方式字段:規(guī)定寄存器/存儲器操作數(shù)的尋址方式(1+1字節(jié))。4
disp位移量字段:段內(nèi)位移量的大小(0,1,2,4字節(jié)組成)。5
data立即數(shù)字段:指明立即數(shù)的大小??蔀?,1,2,4字節(jié)。2022/12/237注:⑴一條指令中可以包含一個操作數(shù),也可有一個以上的操作數(shù),操作數(shù)越長,字節(jié)越多,占用空間越大,執(zhí)行時間越長。⑵只涉及一個操作數(shù)的指令稱為單操作數(shù)指令。其操作數(shù)可由本身提供,也可由指令隱含指出;對二個操作數(shù)的雙操作數(shù)指令,至少有一個操作數(shù)必須由寄存器指出(因?yàn)?0X86的M及I/O空間較大,直接指出一個內(nèi)存單元或一個I/O端口需要較多的位數(shù),而用寄存器編號,則用很少的位數(shù)即可)。2022/12/238⑶對16位偏移量,在指令代碼中或存儲器存放中,低字節(jié)在前;高字節(jié)在后。⑷大部分指令的操作碼為一個字節(jié)。也有的指令為一個字節(jié),不僅包括操作碼,還隱含寄存器,形成單字節(jié)指令。這類指令字節(jié)數(shù)最少,執(zhí)行速度最快,使用也最頻繁。注:2022/12/2393.1.2指令系統(tǒng)的尋址方式一.尋址方式——尋找操作數(shù)的方法操作數(shù)的存放位置有三種可能:1.操作數(shù)包括在指令中:指令中操作數(shù)部分就是操作數(shù)本身。(操作數(shù)存放在代碼段中)此時,操作數(shù)也稱為立即數(shù)。2.操作數(shù)包含在CPU的某個寄存器中:某個寄存器的編碼指明操作數(shù)(操作數(shù)在CPU中)。3.操作數(shù)存放在內(nèi)存中:操作數(shù)部分指明此操作數(shù)的存放地址(操作數(shù)在存儲器中)。2022/12/2310二.有效地址——EA段內(nèi)偏移量由于邏輯地址由段基值和段內(nèi)偏移量構(gòu)成(8086、8088CPU),或由段選擇子和偏移量構(gòu)成(80286以上的CPU),我們把偏移量也稱為有效地址,用EA表示。2022/12/2311構(gòu)成EA的四個地址分量:EA=(基址寄存器)+[(變址寄存器)×比例因子]+位移量
構(gòu)成EA的四個地址分量:基址:16位CPU:BX、BP的內(nèi)容;
32位COU:任一個通用寄存器的內(nèi)容。變址:16位CPU:SI、DI的內(nèi)容;32位CPU:任一個通用寄存器(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
存儲器尋址
①直接尋址 ②寄存器間址 ③基址尋址 ④變址尋址 ⑤基址加變址 ⑥帶位移量的基址加變址 對32位尋址方式還有:
⑦比例變址 ⑧基址加比例變址 ⑨帶位移量的基址加比例變址三.尋址方式分析2022/12/2314以AL、AX及EAX清零為例即AL←0=00H=00000000B
AX←0=0000H=0000000000000000B
EAX←0=00000000H=0……0B
32個“0”
︸2022/12/2315
指令中的操作數(shù)部分就是操作數(shù)本身,與操作碼一起取到指令隊(duì)列中。在執(zhí)行時不需再訪問存貯器,立即數(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位。對16位:AX、BX、CX、DX、SI、DI、SP、BP對8位:AH、AL、BH、BL、CH、CL、DH、DLMOVBX,0;BX←0MOVAX,BX;AX←BX=0顯然,寄存器尋址是CPU內(nèi)部操作,不需要訪問總線周期,所以,指令的執(zhí)行速度快。2022/12/23173存儲器尋址對操作數(shù)是指明參加操作的數(shù)的地址即EA時,這類尋址都是存儲器尋址。隨著尋找EA的不同,存儲器尋址可分為:①直接尋址
②寄存器間接尋址③基址尋址
④變址尋址⑤基址加變址
⑥帶位移量的基址加變址對32位尋址方式還有:⑦比例變址⑧基址加比例變址⑨帶位移量的基址加比例變址2022/12/2318①直接尋址指令中直接給出操作數(shù)的有效地址EA。例:設(shè)DS=4000H,2000H單元開始存放00H,00H。
MOVAL,[2000H];AL←[2000H]=00HP96圖3-32022/12/2319操作數(shù)的有效地址EA存放在SI、DI、BP、BX四個寄存器之一中。借用上例:
MOVBX,2000H;BX←2000HMOVAL,[BX];AL←[BX]=[2000H]=00H,EA=2000H
圖3-4②寄存器間址2022/12/2320對16位間址:BX、SI、DI為間址寄存器時,DS為默認(rèn)段基址;BP為間寄存器時,SS為默認(rèn)段基址。對32位間址:8個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注對存儲器尋址:R為BX、SI、DI或直接地址時,默認(rèn)DS段;R為BP、SP時,默認(rèn)SS段。非默認(rèn)段時,由段超越寄存器指明。如ES:MOVCX,[BX]亦可寫為MOVCX,ES:[BX];段基值由DS改為ES。(見表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ù)地址(通過EA尋址)兩部分構(gòu)成。在遇到轉(zhuǎn)移指令或調(diào)用指令時要確定轉(zhuǎn)向地址。這里我們介紹有關(guān)轉(zhuǎn)移地址的四種尋址方式轉(zhuǎn)移地址的四種尋址方式段內(nèi)直接尋址段內(nèi)間接尋址段間直接尋址段間間接尋址2022/12/23351段內(nèi)直接尋址:EA=IP+DISP(8/16位)由于此時是以IP為基址,DISP是相對IP的差值,故這是一種相對尋址方式,允許其在內(nèi)存中各個區(qū)域運(yùn)行,而不用改變指令,這符合程序的再定位要求。在條件轉(zhuǎn)移時:DISP只允許8位在無條件轉(zhuǎn)移時:8位的DISP稱為短跳轉(zhuǎn)16位的DISP稱為近跳轉(zhuǎn)2022/12/2336例:(匯編語言格式)JMPNEARPTRPROGIA;IP←IP+PROGIA(16B)JMPSHORTQUEST其中PROGIA和QUEST是偏移量的符號地址如是16位:DISP則符號地址前加操作符NEARPTR如是8位:DISP則符號地址前加操作符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)向地址是一個字的有效地址2022/12/2338指令中直接提供轉(zhuǎn)向地址和偏移地址
DISP→IP
段地址→CS
例:JMPFARPTRROUTINE;IP←DISP,CS←DISP所在段
3段間直接尋址:︸段間轉(zhuǎn)移的操作符︸轉(zhuǎn)向的符號地址DISP2022/12/23394段間間接尋址:用存貯器中二個相繼字的內(nèi)容來取代IP和CS寄存器中的原始內(nèi)容以達(dá)到級間轉(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ù)傳送類指令
算術(shù)運(yùn)算指令邏輯運(yùn)算類指令
控制轉(zhuǎn)移指令處理器控制類指令
串處理類指令
下面分別加以說明。(有關(guān)指令符號見表3-3)2022/12/23413.2.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令用于把數(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條這類指令:表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時,目的不能是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;段地址必須通過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正確錯誤}2022/12/2349注意:MOV指令使用時1、立即數(shù)IMM和段寄存器CS不能作為目的操作數(shù)。例MOV5,AX;5←AX,錯
MOVCS,AX;CS←AX,錯2、立即數(shù)不能直接傳送到段寄存器SEG。
例MOVDS,5;DS←5,錯3、兩個存儲單元之間不能直接傳送數(shù)據(jù)。 例MOVMEM1,MEM2;MEM1←MEM22022/12/2350注意:MOV指令使用時4、兩個段寄存器之間不能直接傳送數(shù)據(jù)。例MOVDS,CS;DS←CS,錯5、操作數(shù)類型必須匹配。例MOVAX,BL;AX←BL,錯
MOVCL,DX;CL←DX,錯以上注意點(diǎn)對以后介紹的指令同樣適用。2022/12/23512堆棧操作:①堆?!凑招畔⒌南冗M(jìn)后出(后進(jìn)先出)原則組織的一段內(nèi)存區(qū)域。在80X86/Pentium中此區(qū)域用SS來指示堆棧段基址,用SP指針來指示堆棧地址的偏移量,SP始終指向堆棧的頂部,堆棧的初值SP可由MOVSP,IMM16指令來設(shè)定。低地址高地址出棧入棧SS:SP→2022/12/2352②堆棧的作用★首先,在調(diào)用子程序/中斷服務(wù)處理時,需要暫停主程序的執(zhí)行,轉(zhuǎn)去執(zhí)行子程序/中斷服務(wù)程序,為了保證程序執(zhí)行完畢后能正確地返回到主程序,必須在調(diào)用時記錄下一條要執(zhí)行指令的地址(即CS和IP的值);★其次,在調(diào)用子程序/中斷服務(wù)程序時,往往要用到Reg或影響到標(biāo)志位,為了保證返回時有關(guān)Reg或標(biāo)志位的正確,故也必須記下Reg及Flag的信息;★第三,在子程序嵌套或子程序遞歸的場合,要求能逐次返回上層子程序。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位無符號數(shù):00H~FFH(0~255)2022/12/2358使用該指令,應(yīng)首先在DS段中預(yù)置一個表格,(長度≤256B)表格起始地址的偏移量先送入BX,AL為查找對象在表中的偏移字節(jié)(與表首址之差)(主要用于查找一些無規(guī)則代碼)例:0~9的ASCII代碼查找DS=2000HBX=0800HAL=04EA=0800+04=0804H物理地址:20000+0804=20804H書上例BCD0~9→七段LED代碼見P83圖3-162022/12/23591、 8086系統(tǒng)規(guī)定,凡是遇到給SS賦值時,系統(tǒng)自動禁止外部中斷,直到下一條指令執(zhí)行后,才開放中斷,以防止在修改SS、SP過程中,堆棧空間的混亂。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)時,可直接尋址,亦可間接尋址;對端口地址為兩字節(jié),即256~65535(0100H~FFFFH)時,只能間接尋址;
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)地址傳送亦稱為有效地址計(jì)算指令(見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ù)。(共四條,見P79表3-6)單字節(jié)指令,無操作數(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)用時,保護(hù)/恢復(fù)FR的內(nèi)容,或用于改變TF(跟蹤)狀態(tài)。2022/12/2368例P78PUSHFPOPAXORAX,0100H;使D8=1(TF)PUSHAXPOPF2022/12/23693.2.2算術(shù)運(yùn)算類指令一、算術(shù)運(yùn)算指令涉及的問題1數(shù)據(jù)類型
算術(shù)運(yùn)算類指令主要涉及兩種類型的數(shù)據(jù)即無符號數(shù)和有符號數(shù):
對8位有符號數(shù)的范圍:-128~+127對8位無符號數(shù)的范圍:0~255對16位無符號數(shù)的范圍:0~65535對16位無符號數(shù)的范圍:-132768~327672022/12/2370對壓縮BCD碼的范圍:
0~99(每四位→一個十進(jìn)制數(shù))對非壓縮BCD碼的范圍:
0~9(每8位→一個十進(jìn)制數(shù))
10011001→99(壓縮)
00001001→9(非壓縮)對加/減運(yùn)算:86采用同一套指令
對乘/除運(yùn)算:帶符號數(shù)和無符號數(shù)的運(yùn)算采用的指令不同2022/12/23712運(yùn)算標(biāo)志通常算術(shù)指令都會影響狀態(tài)標(biāo)志F
如:無符號數(shù)運(yùn)算進(jìn)位CF=1
有符號數(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條見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)算的例子見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無進(jìn)位,AF=0低8位為5個1,PF=02022/12/2374指令執(zhí)行后,AX=1D3EH.FR:CF=1,SF=0,OF=0,ZF=0,AF=0,PF=0對AF標(biāo)志是由調(diào)整指令(如DAA)使用的,編程者一般不予考慮。對運(yùn)算結(jié)果分析:如AX,BX為無符號數(shù),則結(jié)果>65535(CF=1);如AX,BX為帶符號數(shù),則結(jié)果在16位補(bǔ)碼所能表示的范圍內(nèi)因而運(yùn)算結(jié)果正確(1D3EH)。
上例AX,BX,如執(zhí)行SUBAX,BX,則 0110010110100000+01001000011000101010111000000010[B79EH]變補(bǔ)*無進(jìn)位→有借位CF=1D15=1→SF=1CS⊕CP=0+1=1→OF=1AX=AE02H*結(jié)果非0→ZF=0無進(jìn)位→有借位,AF=1低8位一個1,PF=0低8位一個1,PF=0分析2022/12/2376這是帶進(jìn)/借位的加/減法指令
單精度——16位運(yùn)算 雙精度——32位運(yùn)算多精度——32位以上運(yùn)算帶進(jìn)/借位的加/減指令主要用來進(jìn)行多精度運(yùn)算。ADC/SBBreg,src;reg←reg±src±CFADC/SBBa,imADC/SBBdst,immADC/SBBdst,reg2ADC/SBB2022/12/2377通常,在多精度(雙)運(yùn)算時,最低字節(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
主要用來對指定操作數(shù)±1,常見于修改循環(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)行兩個數(shù)的大小比較1對相等的兩數(shù),僅測ZF標(biāo)志2對無數(shù)符數(shù),用CF標(biāo)志3對帶符號數(shù),比較復(fù)雜,不能簡單由SF或OF來判斷,而必須根據(jù)SF⊕OF來確定。2022/12/2383小結(jié)符號結(jié)果OFSFZFCF無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;無符號數(shù)乘法運(yùn)算 IMULOPRD;帶符號數(shù)乘法運(yùn)算
2022/12/2389②兩個8位數(shù)相乘,會得到一個16位的乘積,兩個16位數(shù)相乘,會得到一個32位的乘積。
故乘法運(yùn)算時,只指明一個操作數(shù),另一個隱含在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時稍有不同,是低位符號的擴(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]
對有符號數(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這個結(jié)果對3*14是正確的對3*(-2)是錯誤的豎式:0011×111000101010=2A另一種算法:先計(jì)算3*2=6,再求補(bǔ)碼(IMUL)豎式:
0011 × 001000000110
求補(bǔ)11111010求補(bǔ)FA-6此結(jié)果對3*(-2)是正確的對3*14是錯誤的∴要想得到無/有符號數(shù)每次法運(yùn)算的正確結(jié)果,必須分別進(jìn)行無/有符號數(shù)的乘法運(yùn)算。這就是MUL/IMUL的來歷和執(zhí)行過程。乘法運(yùn)算是如此,除法運(yùn)算也相同。2022/12/23932除法運(yùn)算DIVOPRD;IDIVOPRD;
ALAH余商AXDX2022/12/2394①無/帶符號數(shù)除法運(yùn)算:DIVsrc;B,AL←AX/src的商
AH←AX/src的余數(shù) ;W,AX←DXAX/src的商
DX←DXAX/src的余數(shù)
對帶符號數(shù):IDIVsrc,其操作同DIV,只是src是帶符號的,商和余數(shù)也為帶符號數(shù),且余數(shù)的符號與被除數(shù)相同2022/12/2395②除法運(yùn)算的符號擴(kuò)展為了便于進(jìn)行8位/16位的除法運(yùn)算,其被除數(shù)常常設(shè)計(jì)為16位/32位。為此,86指令系統(tǒng)中設(shè)計(jì)了二條符號擴(kuò)展指令
CBW——字節(jié)轉(zhuǎn)換為字指令 ;AL的內(nèi)容符號擴(kuò)展到AH即AL的D7=0→AH=00HAL的D7=1→AH=0FFHD7AHAL2022/12/2396同理CWD——字轉(zhuǎn)換為雙字指令;AX的內(nèi)容符號擴(kuò)展到DX即AX的D15=0→DX=0000HAX的D15=1→DX=0FFFFHD15DXAX2022/12/2397③除法運(yùn)算的溢出除法運(yùn)算,在字節(jié)操作時,要求商為8b。當(dāng)8b操作時,被除數(shù)高8b的絕對值>除數(shù)的絕對值;或16b操作時,被除數(shù)高16b的絕對值>除數(shù)的絕對值,商就會產(chǎn)生溢出,IBMPC機(jī)中設(shè)計(jì)為0型中斷處理。為避免除法溢出,程序在設(shè)計(jì)時應(yīng)考慮溢出判斷及處理。2022/12/2398④例⑴設(shè)AX=0400HBL=0B4H=1024(無)+1024(帶)=180(無)-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帶符號數(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)算與移位類指令用于處理字或字節(jié)中數(shù)據(jù)位的信息。包括邏輯運(yùn)算、移位(循環(huán)移位)指令部分一.
邏輯運(yùn)算指令
見P88表3-10:
NOT、AND、OR、XOR、TEST
所有指令均為按位操作(8/16B)段寄存器不能進(jìn)行邏輯運(yùn)算主要用來組合、屏蔽、取反和測試操作數(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邏輯測試:
TESTOPRD1,OPRD2;OPRD1∩OPRD2
例:TESTAL,10000000B;不保留調(diào)試結(jié)果,但通過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指令:測試Di→置1
屏蔽Di→置0MOVAL,40HTESTAL,0AFH01000000∩1010111100000000MOVDL,ALTESTDL,00000010BJNZexit;測D1位是否為1這里要求測試D0、D1、D2、D3、D5、D7位是否為0,根據(jù)test的結(jié)果CF=OF=0,SF=0、ZF=1說明測試位全為0,如后跟條件轉(zhuǎn)移指令即可進(jìn)行不同處理。2022/12/231104、用XOR指令:取反Di→置1,
不變Di→置0MOVAL,11HXORAL,3000100010000001100010010;D0、D1位取反XOR指令還可用來測試某一操作數(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說明:1目標(biāo)操作數(shù)可以是8B或16B2計(jì)數(shù)值決定移位或循環(huán)次數(shù)計(jì)數(shù)值為1時常用im表示 計(jì)數(shù)值>1時必需用CL表示 計(jì)數(shù)值≤2553通常左/右移對應(yīng)乘/除2n有符號數(shù)除2n→SAR(算術(shù)右移)無符號數(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)移類指令控制轉(zhuǎn)移類指令包括四部分:
轉(zhuǎn)移指令:
JMP/Jx
重復(fù)操作:
LOOP
調(diào)用/返回:CALL/RET
中斷:INTn/IRET
在86/88CPU中,CS和IP決定程序的執(zhí)行順序。
當(dāng)程序發(fā)生轉(zhuǎn)移時,實(shí)際上是把新值賦給CS和IP,下面一一討論8086/8088控制轉(zhuǎn)移的指令。2022/12/23117一轉(zhuǎn)移指令:轉(zhuǎn)移指令分為二類:在段內(nèi)直接轉(zhuǎn)移時,分為短轉(zhuǎn)移和近轉(zhuǎn)移,即IP←IP+DISP(8/16b)SHORT(短轉(zhuǎn)移):若DISP在JMP指令的-128~+127字節(jié)內(nèi),匯編程序就自動產(chǎn)生一個二字節(jié)指令。
NEAR(近轉(zhuǎn)移):若DISP不在短轉(zhuǎn)移的范圍內(nèi),就在±32K范圍內(nèi)尋找目標(biāo)地址,匯編程序就自動產(chǎn)生一個三字節(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無條件轉(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ù)四個地址單元的內(nèi)容為IP和CS的新值即:IP←[EA+1,EA] CS←[EA+3,EA+2]2022/12/231192條件轉(zhuǎn)移共18條見P116表3.2條件轉(zhuǎn)移指令
其特征為:2字節(jié)的SHORTJMP(-128~+127)=>相對IP的JMP即e-2=>e=-126~+129助記符不唯一。JE/JZJA/JNBE測試5個狀態(tài)標(biāo)志:CF、ZF、OF、SF、PF條件轉(zhuǎn)移指令歸納起來分為三類:①單個標(biāo)志:表中1~10。根據(jù)某個標(biāo)志的狀態(tài)來決定轉(zhuǎn)移(5個標(biāo)志10條指令)2022/12/23120②無符號數(shù):表中11~14根據(jù)CF和ZF的狀態(tài)來決定轉(zhuǎn)移③帶符號數(shù):表中15~18根據(jù)SF、OF和ZF的狀態(tài)來決定轉(zhuǎn)移為什么要分帶符號數(shù)和無符號數(shù)呢?因?yàn)槠錅y試狀態(tài)不同(CF、ZF/SF、DF、ZF)例01H和0FEH這兩個數(shù)作為無符號數(shù)01H<0FEH作為帶符號數(shù)01H>0FEH(-2)2022/12/23121∴執(zhí)行下列指令:
MOVAL,01H CMPAL,0FEH后,CF=1,OF=0,SF=0,ZF=0若要求AL中無符號數(shù)>0FEH轉(zhuǎn)移時,必須使用JA∵(CF=1∩ZF=0)∴不轉(zhuǎn)移(AL<0FEH)若要求AL中的帶符號數(shù)>0FFH轉(zhuǎn)移時,必須使用JG∵(SF⊕OF=0∩ZF=0)∴轉(zhuǎn)移(AL>0FEH)2022/12/23122通常,條件轉(zhuǎn)移指令與CMP一起配合使用CMP無符號帶符號目>源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(無符號數(shù))
…
BXM:………2022/12/23124④比較AL>=、<10CMPAL,10JAEAE10
… ;A<10AE10:JAA10
… ;A=10A10: ;A>10……2022/12/23125例:設(shè)2000H開始的區(qū)域中,存放著20個數(shù)據(jù),要求找出其中最大的一個數(shù),并存到2000H單元中。GATMAX: MOVBX,2000H;BX←2000H MOVAL,[BX];AL←第一個數(shù)
MOVCX,19;CX←計(jì)數(shù)值20P1:INCBX;BX指向下個數(shù)
CMPAL,[BX];和下個數(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
利用一條指令來控制程序的循環(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ù)控制類指令:Click2022/12/23127
重復(fù)控制指令使程序簡練如:MOVCX,n MOVCX,nBEGIN:LOOPZ/LOOPELOOPNZ/LOOPNE:功能同LOOP,增加限制循環(huán)條件(ZF)。
注意:ZF的建立非CX所為,而是前面指令執(zhí)行結(jié)果。JCXZ:只是簡單根據(jù)CX=0轉(zhuǎn)移,有的書把其放在條件轉(zhuǎn)移指令中。
LOOPBEGIN;CX←CX-1
……等效循環(huán)體===>……循環(huán)體DECCXJNZBEGIN…BEGIN:…2022/12/23128例:有一個L個字符的字符串存儲于首址為ASCII_STR的存儲區(qū)中?,F(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í)行過程中,有兩種可能:①查找到“space”,此時提前結(jié)束循環(huán)(ZF=1),而順序繼續(xù)執(zhí)行②未查找到“space”,此時因CX=0,而結(jié)束循環(huán),JNZ條件滿足,(是執(zhí)行CMP指令的結(jié)果?。┒D(zhuǎn)到not_found去執(zhí)行。 在繼續(xù)執(zhí)行時,可打印出找到“space”,以及“space”的位置;在執(zhí)行not_found時,可打印未找到“space”的信息。2022/12/23131三調(diào)用/返回指令模塊化程序設(shè)計(jì)子程序?qū)⒁恍┚哂歇?dú)立功能的部分程序編寫成獨(dú)立的程序模塊調(diào)用過程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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小兒胃腸道超聲課件
- 小兒窒息課件
- 凍肉食品供應(yīng)合作協(xié)議書
- 家庭財(cái)產(chǎn)協(xié)議怎樣取消合同
- 小兒推拿積食課件講解圖
- 關(guān)于錳礦加工的合同范本
- 上海美甲店轉(zhuǎn)讓合同范本
- 小兒推拿嘔吐病例課件
- 三一鉚工基礎(chǔ)知識培訓(xùn)課件
- 難點(diǎn)解析-魯教版(五四制)8年級數(shù)學(xué)下冊試題含答案詳解【滿分必刷】
- XX縣中小學(xué)校食堂管理試卷
- 多選題1-500題附有答案
- 2024年廣東省佛山市投資促進(jìn)中心招聘歷年【重點(diǎn)基礎(chǔ)提升】模擬試題(共500題)附帶答案詳解
- 湖北省武漢市武昌區(qū)2023-2024學(xué)年高二下學(xué)期6月期末考試數(shù)學(xué)試題
- 絨繡的教案完整版本
- 綠盟科技2023年4月合作伙伴NSSP-Service認(rèn)證附有答案
- 廣西南寧市小升初擇校分班考押題卷試題-2023-2024學(xué)年六年級下冊數(shù)學(xué) 人教版
- 2024年(基樁低應(yīng)變反射波法)檢測及試驗(yàn)技能與理論知識考試題庫與答案
- 小學(xué)校教材教輔讀物自查自糾排查表
- 新東外環(huán)北段橋梁工程見證取樣計(jì)劃書
- 中國老年糖尿病診療指南(2024版)解讀
評論
0/150
提交評論