版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章指令系統(tǒng)
【本章提要】本章重點講述IA-32系列CPU的常用指令,和支持EM64T技術(shù)的高級Pentium4以及Core系列CPU的Intel64指令系統(tǒng)。【學習目標】熟練掌握匯編語言各種指令的功能和操作數(shù)在內(nèi)存的存放規(guī)律掌握各種指令對操作數(shù)和尋址方式的特殊要求,明確不同指令對標志寄存器的具體影響等方面熟悉CPU內(nèi)部各寄存器的使用規(guī)則及其在指令執(zhí)行過程中的隱含約定22十月202380X86指令集8086指令集PentiumX指令集Core2指令集指令系統(tǒng)是CPU所能執(zhí)行的各種指令的集合,定義了計算機硬件所能完成的基本操作,不同的CPU有不同的指令系統(tǒng)。8086/8088CPU的指令系統(tǒng)是基本指令集,80X86、PentiumX以及Core2系列的指令系統(tǒng)保留了基本指令集,又進行了擴充。4.1指令系統(tǒng)概述22十月20238086/8088指令系統(tǒng)是基本指令集,指令的操作數(shù)寬度是8位或16位,偏移地址寬度是16位。IA-32擴充指令和系統(tǒng)控制指令的操作數(shù)寬度可以是8位、16位或32位,偏移地址寬度一般是32位。64位方式指令的操作數(shù)可以是8位、16位、32位或64位,操作數(shù)的偏移地址可以是16位、32位或64位。指令系統(tǒng)大體可以分成7個功能組:數(shù)據(jù)傳送類、算術(shù)運算類、邏輯運算與移位類、串操作類、控制轉(zhuǎn)移類、處理器控制和其他類。22十月2023符號意義OPRD,OPRDN操作數(shù),第N個操作數(shù)如OPRD1、OPRD2、OPRD3等DEST,SRC目的操作數(shù),源操作數(shù)REG88位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL/SIL/DIL/SPL/BPL以及R8L~R15LREG1616位通用寄存器AX/BX/CX/DX/SI/DI/BP/SP以及R8W~R15WREG3232位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP以及R8D~R15DREG6464位通用寄存器RAX/RBX/RCX/RDX/RSI/RDI/RBP/RSP以及R8~R15REGREG8/REGL6/REG32/REG64SEG段寄存器DS/CS/SS/ES/FS/GSMEM8/MEM16/MEM32/MEM648位/16位/32位/64位內(nèi)存操作數(shù)MEMMEM8/MEM16/MEM32/MEM64IMM8/IMM16/IMM32/IMM648位/16位/32位/64位立即數(shù)IMMIMM8/IMM16/IMM32/IMM6422十月20234.2數(shù)據(jù)傳送類指令指令書寫格式指令功能MOVREG/MEM/SEG,REG/MEM/SEG/IMMXCHGREG/MEM,REG/MEMXLATBSWAPREG32從SRC傳送到DEST交換兩個操作數(shù)的內(nèi)容字節(jié)翻譯字節(jié)交換指令(486新增)通用數(shù)據(jù)傳送堆棧操作地址傳送標志位傳送I/O數(shù)據(jù)傳送傳送類指令執(zhí)行后對標志位都沒有影響(除SAHF、POPF和POPFD外)。4.2.1通用數(shù)據(jù)傳送指令
22十月2023(1)MOV指令指令格式:MOVOPRD1,OPRD2功能:將源操作數(shù)傳送給目標操作數(shù)【例】MOVAL,BH;通用寄存器之間傳送字節(jié)數(shù)據(jù)
MOVDS,AX
;通用寄存器與段寄存器(CS不能是目標)之間傳送數(shù)據(jù)
MOVEAX,12345678H;立即數(shù)傳送到通用寄存器
MOVRAX,BUFFER
;通用寄存器與存儲器之間64位數(shù)據(jù)傳送
MOVDAT[BP+DI],ES
;段寄存器與存儲器之間傳送數(shù)據(jù)22十月2023MOV指令操作數(shù)要求段寄存器DS/CS/SS/ES/FS/GS通用寄存器8位、16位、32位、64位存儲器立即數(shù)8位、16位、32位、64位注意:①立即數(shù)和段寄存器CS不能作為目標操作數(shù);②立即數(shù)不能直接傳送到段寄存器;③兩個存儲單元之間不能直接傳送數(shù)據(jù);④兩個段寄存器之間不能直接傳送數(shù)據(jù);⑤兩個操作數(shù)寬度必須一致。22十月2023(2)交換指令XCHG指令格式:XCHG OPRD1,OPRD2功能:將OPRD1與OPRD2進行交換。二者都是源操作數(shù)也都是目的操作數(shù)。操作數(shù)可以是寄存器或內(nèi)存數(shù)變量。【例】MOV EAX,12345678H;EAX=12345678H MOV EBX,56781234H;EBX=56781234H XCHG EAX,EBX;交換后,EAX=56781234H,
EBX=12345678HXCHGR8,[100];R8寄存器內(nèi)容與內(nèi)存100號地址中的64位數(shù)據(jù)交換注意:①不能在兩個存儲單元之間直接交換數(shù)據(jù);②段寄存器和立即數(shù)不能作為操作數(shù)。22十月2023(3)查表轉(zhuǎn)換指令XLAT指令格式:XLAT功能:完成一個字節(jié)的查表轉(zhuǎn)換,將數(shù)據(jù)段中偏移地址為BX/ebx/RBX與AL寄存器之和的存儲單元的內(nèi)容送入AL寄存器,即:[BX+AL]→AL。例:若(BX)=0100H,(AL)=05H,執(zhí)行XLAT指令后,(AL)=2CH。注意:由于AL只有8位,所以表的長度不能超過256字節(jié)。22十月2023(4)字節(jié)交換指令BSWAP是80486新增的指令指令格式:BSWAP reg32功能:將32位通用寄存器中的雙字以字節(jié)為單位進行高、低字節(jié)交換,改變雙字數(shù)據(jù)的存放方式。指令執(zhí)行時,字節(jié)0(b0~b7)與字節(jié)3(b24~b31)交換,字節(jié)1(b8~b15)與字節(jié)2(b16~b23)交換。字節(jié)3字節(jié)2字節(jié)1字節(jié)022十月20234.2.2堆棧操作指令指令書寫格式指令功能PUSHREG/MEM/SEGPOPREG/MEM/SEGPUSHIMMPUSHAPOPAPUSHADPOPAD壓入堆棧彈出堆棧IMM擴展為16/32位后進棧(286新增)8個16位通用寄存器進棧(286新增)8個16位通用寄存器出棧(286新增)8個32位通用寄存器進棧(386新增)8個32位通用寄存器出棧(386新增)(1)PUSH/POP
堆棧是內(nèi)存的一個數(shù)據(jù)區(qū),是按照先進后出原則組織的一段內(nèi)存區(qū)域,段寄存器SS指向段基址,堆棧指針SP始終指向堆棧的頂部。
PUSHREG16/REG32/REG64/MEM16/MEM32/MEM64POPREG16/REG32/REG64/MEM16/MEM32/MEM6422十月2023PUSH指令:①SP-N→SP;②16/32/64位的源操作數(shù)壓入堆棧源操作數(shù)可以是通用寄存器、段寄存器和存儲器,N為源操作數(shù)的字節(jié)數(shù)2或4或8。POP指令:①從棧頂彈出操作數(shù)到目標操作數(shù);②SP+N→SP
目標操作數(shù)可以是通用寄存器、段寄存器(CS除外)或存儲器。
PUSH/POP指令22十月2023(2)PUSH/PUSHA/POPA是80286新增的指令指令格式:PUSH imm16PUSHAPOPA指令功能:
①PUSHimm16將字立即數(shù)壓入堆棧,如果給出的數(shù)不夠16位,它會在自動擴展后壓入堆棧;
②PUSHA指令將所有通用寄存器的內(nèi)容壓入堆棧,壓入的順序是:AX、CX、DX、BX、SP、BP、SI、DI;③POPA指令將棧頂內(nèi)容彈出,順序與壓入的相反(彈出到SP的值被丟棄)。22十月2023(3)PUSHAD/POPAD386新增指令PUSHAD指令將所有擴展通用寄存器的內(nèi)容壓入堆棧,壓入的順序是:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI;POPAD彈出的順序與PUSHAD壓入的相反(彈出到ESP的值被丟棄)。注意:在64位模式下,入棧和出棧指令的操作數(shù)只能是16位或64位,不支持32位操作數(shù)。
22十月20234.2.3地址傳送指令(1)有效地址傳送指令LEA指令格式:LEAREG16/REG32/REG64,MEM功能:將源操作數(shù)在當前段內(nèi)的有效地址(即地址偏移量)傳送至目標操作數(shù)。區(qū)別:MOV指令傳送操作數(shù)的內(nèi)容,而LEA傳送的是操作數(shù)的地址。MOV DI,LISTS;將變量LISTS的內(nèi)容傳送至DI,DI=1234HLEA DX,LISTS;將變量LISTS的偏移地址傳送至DX,DX=2000HLEAAX,[3000H];將3000H單元的偏移地址傳送至AX,AX=3000HLEAESI,LISTS;將變量LISTS的32位偏移地址傳送至ESI,
ESI=00002000HLEARDX,LISTS;將變量LISTS的64位有效地址傳送至RDXLEAEDX,[RAX];將[RAX]的64位地址的低32位(即EAX的值)傳送至EDXLEASI,[RAX];將[RAX]的64位地址的低16位(即AX的值)傳送至SI22十月2023(2)地址指針傳送指令LDS和LES指令格式:LDS REG16/REG32,MEMLES REG16/REG32,MEM指令功能:都是將由源操作數(shù)偏移地址決定的雙字(或三字)單元中的第一個(或前兩個)字的內(nèi)容送入指令指定的16位(或32位)通用寄存器,第二個(或第三個)字的內(nèi)容傳送給段寄存器DS或ES,這兩個段寄存器是隱含的目的操作數(shù)。TAB1DF123456789ABCH;定義TAB1為6個字節(jié)數(shù)據(jù)TAB2DD56781234H;定義TAB2為4個字節(jié)數(shù)據(jù)LDSBX,TAB1;將9ABCH→BX,5678H→DSLESSI,TAB2;將1234H→SI,5678H→ESLESEAX,TAB1;將56789ABCH→EAX,1234H→ES只適用于16位或32位地址模式,在64位地址下不能使用22十月20233)地址指針傳送指令LFS、LGS和LSS386新增指令指令功能:與上述的LDS功能基本一樣,不同的是將第二個(或第三個)字的內(nèi)容分別傳送給隱含的段寄存器FS、GS和SS。注意:在16位模式下,偏移地址為16位,上述各指令的目的寄存器用16位的;在32位保護模式下,偏移地址為32位,上述各傳送指令的目的寄存器應該是32位的。但段寄存器總是16位的。22十月20234.2.4標志位傳送指令(1)標志寄存器讀寫指令LAHF/SAHF指令LAHF用于將標志寄存器的低字節(jié)(含SF、ZF、AF、PF和CF)讀出后傳送到AH寄存器。
不影響標志位指令SAHF與LAHF的操作相反,它把寄存器AH中的內(nèi)容寫入標志寄存器的低字節(jié),取代某些標志位(SF、ZF、AF、PF和CF)的原來狀態(tài)。指令書寫格式指令功能LAHFSAHFPUSHFPOPFPUSHFDPOPFD將FLAG低字節(jié)裝入AH寄存器將AH內(nèi)容裝入Flag低字節(jié)將FLAG內(nèi)容壓入堆棧從堆棧彈出Flag內(nèi)容將EFLAG內(nèi)容壓入堆棧(386新增)從堆棧彈出32位到EFLAG(386新增)22十月20232)標志寄存器入棧出棧指令PUSHF指令的執(zhí)行過程同PUSH指令,只是將標志寄存器FLAG的內(nèi)容壓入堆棧。POPF則將當前棧頂?shù)囊粋€字傳送給標志寄存器,同時修改SP+2→SP。PUSHFD/POPFD指令是386新增的指令,功能與PUSHF/POPF基本相同,但操作為EFLAG與堆棧之間的傳送。PUSHFQ指令和POPFQ指令是64位指令,用于RFLAGS與堆棧之間的64位傳送,只能用于64位地址方式。22十月20234.2.5輸入/輸出數(shù)據(jù)傳送指令指令書寫格式指令功能IN累加器,端口OUT端口,累加器INSB/INSW/INSDOUTSB/OUTSW/OUTSD輸入字節(jié)或字輸出字節(jié)或字串輸入(286/386新增)串輸出(286/386新增)(1)簡單輸入輸出指令I(lǐng)N/OUT指令格式:INAL/AX,IMM8/DXOUTIMM8/DX,AL/AX指令功能:專門用于在AL或AX寄存器與I/O端口之間傳送數(shù)據(jù)例:INAX,30H;從端口30H輸入16位數(shù)到AXMOVDX,300HINAL,DX;從端口300H輸入8位數(shù)到ALOUT60H,AL;將8位數(shù)從AL輸出到端口60HOUTDX,AX;將16位數(shù)從AX輸出到DX指定的端口在80386以后的32位CPU中,還可以通過EAX對I/O端口進行雙字數(shù)據(jù)操作。在64位系統(tǒng)中,使用方法和16位/32位方式下相同。22十月2023(2)字符串輸入指令I(lǐng)NS指令形式:INSB:從DX指定的端口輸入一個字節(jié)到ES:DI指定的內(nèi)存單元中去。INSW:從DX指定的端口輸入一個字到ES:DI指定的內(nèi)存單元中去。INSD:從DX指定的端口輸入雙字到ES:DI指定的內(nèi)存單元中去。注意:若方向標志DF=0,則DI中的地址自動+1(輸入字節(jié))或+2(輸入字)或+4(輸入雙字);若方向標志DF=1,則DI中的地址自動-1(輸入字節(jié))或-2(輸入字)或-4(輸入雙字)。在64位方式下目標地址偏移量由EDI或RDI指明,指令功能和用法不變22十月2023(3)字符串輸出指令OUTSOUTSB:從DS:SI指定的內(nèi)存單元輸出一個字節(jié)到DX指定的端口中去。OUTSW:從DS:SI指定的內(nèi)存單元址輸出一個字到DX指定的端口中去。OUTSD:從DS:SI指定的內(nèi)存單元輸出雙字到DX指定的端口中去。方向標志DF的用法同INS指令22十月20234.3算術(shù)運算類指令加法減法乘法除擴展指令外,指令的執(zhí)行結(jié)果都影響狀態(tài)標志位指令名稱指令書寫格式狀態(tài)標志位OFSFZFAFPFCF加法加法帶進位加法加1交換加(486)ADDreg/mem,reg/mem/immADCreg/mem,reg/mem/immINCreg/memXADDreg/mem,regYYYYYYYYYYYYYYYYYYYYYYNY減法減法帶借位減法減1取負比較比較交換(486)8字節(jié)比較交換(奔騰)SUBreg/mem,reg/mem/immSBBreg/mem,reg/mem/immDECreg/memNEGreg/memCMPreg/mem,reg/mem/immCMPXCHGreg/mem,regCMPXCHG8Bmem64YYYYYYYYYYYYYYYYYNYYYYY1YYYYYYYYYYYYNNYNNN除法擴展十進制調(diào)整22十月2023一.加減法類指令(1)加減法指令ADD/SUB指令格式:
ADDreg/mem,reg/mem/immSUBreg/mem,reg/mem/imm功能:
ADD完成兩個操作數(shù)的加運算,結(jié)果送入第一個操作數(shù);
SUB完成第一個操作數(shù)減去第二個操作數(shù),差送回到第一個操作數(shù)。
0110010110100000+)101101111001111010001110100111110結(jié)果非零:ZF=0無進位:AF=0低8位為偶數(shù)個1:PF=0最高位有進位:CF=1最高位為0:SF=0OF=最高位進位1⊕次高位進位1,則OF=0【例】設(shè)AX=65A0H,BX=B79EH,指令ADDBX,AX的執(zhí)行情況如下:BX=1D3EH,CF=1,SF=0,OF=0,AF=0,PF=0,ZF=0。22十月2023(2)帶進位、借位的加減法指令ADC/SBB指令格式:ADC OPRD1,OPRD2SBB OPRD1,OPRD2指令功能:常用于長度為兩個字或兩個字以上的操作數(shù)的運算,加法操作時在最低位加上進位位CF,或減法操作時減去借位位CF。例如:如果有一個64位數(shù)據(jù)已存放在EAX(高32位)和EBX(低32位)中,現(xiàn)要加上一個常數(shù)123456789ABCDEF0H,這時可用下面兩條指令實現(xiàn):
ADDEBX,9ABCDEF0HADCEAX,12345678H22十月2023(3)增量和減量指令I(lǐng)NC/DEC指令格式:INCMEM/REGDECMEM/REG功能:是單操作數(shù)指令,完成對指定的操作數(shù)加1/減1(1是隱含的),然后返回此操作數(shù)。注意:指令執(zhí)行的結(jié)果影響標志位AF、OF、PF、SF和ZF,而不影響進位標志CF。例:INCCX;CX寄存器中的內(nèi)容加1DECWORDPTR[EAX];把EAX指向的字存儲單元內(nèi)容減1在64位方式下,大多數(shù)INC/DEC指令都是可以使用的。但是單字節(jié)編碼的INC/DEC指令因為與16個REX前綴代碼相同,所以不能使用。22十月2023(4)求補指令NEG指令格式:NEG REG/MEM功能:用零減去操作數(shù),再把結(jié)果送回操作數(shù)。該指令執(zhí)行的效果是改變操作數(shù)的符號,將正數(shù)變成負數(shù)或?qū)⒇摂?shù)變成正數(shù),但絕對值不變,所以又稱為取負指令。注意:NEG指令影響所有狀態(tài)標志:若操作數(shù)不是0,則總是使CF=1,否則置0;若在字節(jié)操作時對-128、或在字操作時對-32768求補、或在32位操作時對-232求補則操作數(shù)沒變化,但溢出標志OF=1。例:NEGEBX;對EBX求補,即EBX←0-EBXNEGBYTEPTR[SI];對8位內(nèi)存操作數(shù)求相反數(shù)NEGAL;AL←0-ALADDAL,200;以上兩條指令實現(xiàn)AL←(200-AL)的運算NEGRAX;RAX←0-RAXNEGQWORDPTR[EAX];對64位內(nèi)存操作數(shù)求相反數(shù)22十月2023(5)比較指令CMP指令格式:CMPOPRD1,OPRD2功能:將OPRD1-OPRD2,運算結(jié)果不送回OPRD1,執(zhí)行后不改變源操作數(shù)和目標操作數(shù),僅僅影響標志位,其它方面和SUB指令相同。討論:1)如果是兩個無符號數(shù)比較,可根據(jù)CF來判斷:若CF=1,則OPRD1<OPRD2;若CF=0,則OPRD1>OPRD2。2)如果是兩個有符號數(shù)比較,要根據(jù)SF和OF來判斷:若SF⊕OF=0,則OPRD1>OPRD2;若SF⊕OF=1,則OPRD1<OPRD2。3)不管操作數(shù)有無符號,若ZF=1則兩者相等,否則不等.22十月2023(6)交換加法指令XADD指令格式:XADDREG/MEM,REG功能:首先將兩個操作數(shù)的內(nèi)容交換,然后兩個操作數(shù)的值相加,結(jié)果送入第一個操作數(shù)。(7)比較并交換指令CMPXCHG指令格式:CMPXCHGREG/MEM,REG功能:將目標操作數(shù)與AL、AX或EAX的內(nèi)容進行比較:如果相等則ZF=1,并將源操作數(shù)送入目標操作數(shù);否則ZF=0,并將REG/MEM送到相應的累加器。例如:CMPXCHGECX,EDX
若ECX=EAX,則ECX←EDX,且ZF=1;
否則,EAX←ECX,且ZF=0。22十月2023(8)8字節(jié)比較并交換指令CMPXCHG8B指令格式:CMPXCHG8BMEM64功能:將EDX(高32位):EAX(低32位)的值與內(nèi)存單元MEM64中的64位數(shù)進行比較,若相等,則置ZF=1,并將ECX:EBX的值傳送到MEM64指定的內(nèi)存地址;否則,置ZF=0,將MEM64的8字節(jié)內(nèi)容傳送到EDX:EAX。
該指令只影響ZF標志。22十月2023二.乘除法指令指令名稱指令書寫格式狀態(tài)標志位OFSFZFAFPFCF乘法不帶符號乘法帶符號整數(shù)乘法雙操作數(shù)乘三操作數(shù)乘MULreg/memIMULreg/memIMULreg,mem/immIMULreg,reg/mem,immYYYY****************YYYY除法不帶符號除法帶符號整數(shù)除法DIVreg/memIDIVreg/mem************(1)乘法指令MUL/IMUL指令格式:MULREG/MEMIMULREG/MEM功能:分別用于實現(xiàn)無符號數(shù)的乘法和有符號數(shù)的乘法運算。它們都只有一個源操作數(shù),可以是寄存器或存儲器,而目標操作數(shù)隱含規(guī)定在累加器中。22十月2023(32位乘積)(16位乘積)╳(8位源操作數(shù))ALsrcAX字節(jié)乘法AX(16位源操作數(shù))src╳DXAX字乘法(64位乘積)╳(32位源操作數(shù))EAXsrcEDXEAX32位乘法(128位乘積)╳(64位源操作數(shù))RAXsrcRDXRAX64位乘法當乘積的高半部分(字節(jié)相乘時為AH、字相乘時為DX、雙字相乘時為EDX、64位相乘時為RDX)不為0,則標志CF=OF=1,表示在AH(或DX、EDX、RDX)中存有結(jié)果的有效數(shù)字;否則CF=OF=022十月2023(2)除法指令DIV/IDIV指令格式:DIV REG/MEMIDIV REG/MEM功能:分別用于無符號數(shù)的除法和帶符號數(shù)的除法運算。指令中對操作數(shù)的規(guī)定同乘法指令,除法指令執(zhí)行后,所有的狀態(tài)標志都不確定。商余數(shù)余數(shù)商32位被除數(shù)16位被除數(shù)AX8位ALAHDXAX16位AXDX余數(shù)商64位被除數(shù)EDXEAX32位EAXEDX余數(shù)商128位被除數(shù)RDXRAX64位RAXRDX若商超過存放它的寄存器的容量(分別為8位、16位、32位或64位)則引起0型中斷(即除法出錯中斷),商和余數(shù)的值不能確定。22十月2023(3)有符號多操作數(shù)乘法指令指令格式一:
IMULreg16,reg16/mem16/imm16/imm8IMULreg32,reg32/mem32/imm32/imm8IMULreg64,reg64/reg32/mem64/imm32/imm8功能:用第一個操作數(shù)乘以第二個操作數(shù),返回的積存放在操作數(shù)1指定的寄存器中。指令格式二:
IMULreg16,reg16/mem16,imm16/imm8IMULreg32,reg32/mem32,imm32/imm8IMULreg64,reg64/mem64,imm32/imm8功能:用第二個操作數(shù)乘以第三個操作數(shù),返回的積存放在操作數(shù)1指定的寄存器中。兩種形式中,對乘積都限制其長度與第一個操作數(shù)的要一致(為16位、32位或64位有符號數(shù)),如果溢出,則溢出部分丟掉,并置CF=OF=1,否則CF=OF=0,其余標志位無定義。22十月2023【例3.28】
IMULBX,CX;BX←BX×CXIMULBX,100;BX←BX×100IMULAX,[BX+DI],1342H
;AX←1342H×DS:[BX+DI]IMULAX,BX,30;AX←30×BXIMULEAX,EBX,123456H
;EAX←EAX×EBX×123456HIMULRAX,RBX,12345678H
;RAX←RAX×RBX×12345678H22十月2023三.符號擴展指令1.基本符號擴展指令CBW/CWDE/CDQE指令格式:CBWCWDECDQE功能:操作數(shù)隱含規(guī)定在累加器中。
CBW將AL中的字節(jié)符號數(shù)的符號擴展到AX中;
CWDE將AX中的字有符號數(shù)的符號擴展到EAX中;
CDQE將EAX中的字有符號數(shù)的符號擴展到RAX中,只能在64位方式下使用。擴展規(guī)則如下:①若AL<80H,則AH←0
若AL≥80H,則AH←0FFH②若AX<8000H,則EAX高16位←0
若AX≥8000H,則EAX高16位←0FFFFH③若EAX<80000000H,則RAX高32位←0
若EAX≥80000000H,則RAX高32位←0FFFFFFFFH這3條指令都不影響任何標志。22十月20232.雙寄存器符號擴展指令CWD/CDQ/CQO指令格式:CWDCDQCQO功能:CWD功能為將AX寄存器的內(nèi)容符號擴展到DX中;
CDQ指令的功能為將EAX寄存器的內(nèi)容符號擴展到EDX中;
CQO指令的功能為將RAX寄存器的內(nèi)容符號擴展到RDX中,只能在64位方式下使用。它們都不影響標志位。一般來說符號擴展指令大都與除法指令相結(jié)合,為達到被除數(shù)的位數(shù)要求而擴展?!纠?.29】求0ABCH÷0200H(帶符號數(shù)相除)由于除數(shù)為字,則必須將原來的被除數(shù)進行符號擴展后才能相除。MOV AX,0ABCHCWD ;被除數(shù)擴展為DX:AX=00000ABCHMOV BX,0200HIDIV BX ;AX←商0AH,DX←余數(shù)E5H22十月20233.擴展傳送指令MOVSX/MOVZX指令格式:MOVSXREG16/REG32/REG64,REG8/MEM8/REG16/MEM16MOVZXREG16/REG32/REG64,REG8/MEM8/REG16/MEM16源操作數(shù)的長度小于目標操作數(shù)的長度;若目標操作數(shù)是64位寄存器,則該指令只能用在64位方式下。MOVSX用于傳送有符號數(shù),并將符號位擴展到目標操作數(shù)的所有位;MOVZX用于傳送無符號數(shù),將0擴展到目標操作數(shù)的所有位。常用于作除法時對被除數(shù)位數(shù)的擴展。
【例3.30】MOVZXEAX,CX;將CX中16位數(shù)零擴展為32位送入EAXMOVSXRCX,AL;將AL內(nèi)容符號擴展為64位送入RCX。22十月2023四.BCD算術(shù)運算指令(1)非壓縮BCD碼加/減法調(diào)整指令AAA/AAS指令格式:加法調(diào)整指令AAA
減法調(diào)整指令AAS功能:若(AL&0FH)>9或標志AF=1,則AL←AL±6AH←AH±1AF←1CF←AFAL←AL&0FH指令名稱指令書寫格式狀態(tài)標志位OFSFZFAFPFCF加法的ASCII碼調(diào)整加法的十進制調(diào)整減法的ASCII碼調(diào)整減法的十進制調(diào)整乘法的ASCII碼調(diào)整除法的ASCII碼調(diào)整AAADAAAASDASAAMAAD***Y***Y*YYY*Y*YYYYYYY*N*Y*YYY1YYY**
0000011000010010(AL&0FH>9)∧00001111(AL與0FH)0000011000000010(62的BCD碼)
0000001000000111(27的BCD碼)+0000001100000101(35的BCD碼)
0000010100001100(AL&0FH>9)+00000001+00000110(AH+1,AL+6調(diào)整)22十月2023(2)壓縮BCD碼加減法調(diào)整指令DAA/DAS指令格式:加法調(diào)整指令DAA
減法調(diào)整指令DAS功能:若(AL&0FH)>9或AF=1,則AL←AL±6AF←1若AL>9FH或CF=1,則AL←AL±60HCF←1;【例3.31】AL=65H(十進制數(shù)65的BCD碼),BH=47H(十進制數(shù)47的BCD碼),用下列指令可得到這兩個數(shù)和的正確結(jié)果。SUB AL,BH;AL←AL–BH(AL的值為1EH)DAS ;將AL的內(nèi)容調(diào)整為18H22十月2023(3)非壓縮BCD碼乘除法調(diào)整指令AAM/AAD指令格式:乘法調(diào)整指令AAM
除法調(diào)整指令AADAAM緊跟在MUL指令之后,能把在AX中的兩個非壓縮BCD數(shù)相乘的結(jié)果進行調(diào)整,得到正確的非壓縮BCD的乘積(高位在AH中,低位在AL中)。調(diào)整操作為:AH←AL/0AH ;AH←AL被0AH除的商AL←AL%0AH ;AL←AL被0AH除的余數(shù)AAD指令用來在進行兩個非壓縮BCD數(shù)的除法運算之前,先調(diào)整AL和AH中的內(nèi)容,再用二進制除法指令DIV相除。相除以后,以非壓縮BCD數(shù)表示的商在AL中,而相應的余數(shù)在AH中。調(diào)整操作為:AL←AH×0AH+ALAH←022十月20234.4邏輯運算與移位指令(1)邏輯非指令NOT指令格式:NOT reg/mem功能:將操作數(shù)按位取反送回。例:NOTEAX;若指令執(zhí)行前(EAX)=66668888H,
則指令執(zhí)行后(EAX)=99997777H。一.邏輯運算指令指令名稱指令書寫格式狀態(tài)標志位OFSFZFAFPFCF‘非’
NOT目標NNNNNN‘與’AND目標,源0YY*Y0‘或’OR目標,源0YY*Y0‘異或’XOR目標,源0YY*Y0‘測試’TEST目標,源0YY*Y022十月2023(2)邏輯與/或/異或指令指令格式:AND/OR/XOR reg/mem,reg/imm/memreg功能:執(zhí)行按位邏輯“與”、“或”和“異或”操作,兩個操作數(shù)寬度必須相等,執(zhí)行結(jié)果存入第一個操作數(shù)中。AND實現(xiàn)邏輯“與”操作:例:ANDAL,0FH;AL的高4位被屏蔽,低4位被析取OR實現(xiàn)邏輯“或”操作:例:ORBX,0003H;BX寄存器的第0位和第1位置1XOR實現(xiàn)邏輯“異或”操作:例:XOREBX,00000001H;改變BX寄存器第0位的狀態(tài)22十月2023(3)測試指令TEST指令格式:TEST reg/mem,reg/mem/imm指令功能:與AND指令相同,但操作結(jié)果不送回目標操作數(shù),即兩個操作數(shù)不變,只影響標志位。例:若要檢測AL中的最低位是否為1,為1則轉(zhuǎn)移,可使用以下指令:
TESTAL,01H JNZTHAT;ZF=0,則AL寄存器的第0位為1,轉(zhuǎn)移到THAT
…THAT:…
…22十月2023二.移位和循環(huán)移位指令類別指令名稱指令書寫格式狀態(tài)標志位OFSFZFAFPFCF移位邏輯左移SHL目標,計數(shù)值YYY*YY算術(shù)左移SAL目標,計數(shù)值YYY*YY邏輯右移SHR目標,計數(shù)值YYY*YY算術(shù)右移SAR目標,計數(shù)值YYY*YY多位左移SHLDOPRD1,OPRD2,OPRD3YYY*YY多位右移SHRDOPRD1,OPRD2,OPRD3YYY*YY循環(huán)移位循環(huán)左移ROL目標,計數(shù)值YNN*NY循環(huán)右移ROR目標,計數(shù)值YNN*NY帶進位循環(huán)左移RCL目標,計數(shù)值YNN*NY帶進位循環(huán)右移RCR目標,計數(shù)值YNN*NY22十月2023(1)移位指令SHL/SAL/SHR/SAR具體指令為:SHL/SAL/SHR/SAR reg/mem,1/CL/imm8指令影響PF、SF、ZF、CF以及OF五個標志位,對AF的影響不確定。
CF:總是等于目標操作數(shù)最后移出的那一位。
OF:---如果移位計數(shù)值為1,且執(zhí)行結(jié)果使目標操作數(shù)的符號位(最高位)
發(fā)生變化,則OF=1,否則OF=0;
---若移位計數(shù)值不為1,則OF狀態(tài)不定。SHLCF0SALCF0ROLCFRCLCFSHRCF0SARCFRORCFRCRCF22十月2023【例3.37】若AL中存有8位有符號數(shù),現(xiàn)需要將其乘以16(2的4次方),結(jié)果存入AX中,則可用以下指令完成:CBW ;將字節(jié)AL擴展到字AXSAL AX,4(或SHLAX,4) ;AX←AX×16【例3.38】下面的程序段可用來執(zhí)行(RAX)*5/2的運算(假設(shè)運算過程中沒有超出64位)。MOVRDX,RAX;RAX暫存于RDXSALRAX,2;RAX*4ADDRAX,RDX;5倍RAXSARRAX,1;RAX除以222十月2023(2)循環(huán)移位指令ROL/ROR/RCL/RCR具體指令為:
ROL/ROR/RCL/RCRreg/mem,1/CL/imm8
若有一個8字節(jié)數(shù),它們或是存放在兩個寄存器中(如EAX和EDX中),或是存放在連續(xù)的內(nèi)存單元中,則可用下面的指令來實現(xiàn)這個8字節(jié)數(shù)整個左移一位。
SALEAX,1或:SALFIRST_DWORD,1RCLEDX,1RCLSECOND_DWORD,122十月2023類別指令名稱指令書寫格式狀態(tài)標志位OFSFZFAFPFCF基本串操作指令字節(jié)/字/雙字串傳送MOVS目標串,源串MOVSB/MOVSW/MOWSD/MOWSQNNNNNNNNNNNN字節(jié)/字/雙字串比較CMPS目標串,源串CMPSB/CMPSW/CMPSD/CMPSQYYYYYYYYYYYY字節(jié)/字/雙字串搜索SCAS目標串,源串SCASB/SCASW/SCASD/SCASQYYYYYYYYYYYY讀字節(jié)/字/雙字串LODS目標串,源串LODSB/LODSW/LODSD/LODSQNNNNNNNNNNNN寫字節(jié)/字/雙字串STOS目標串,源串STOSB/STOSW/STOSD/STOSQNNNNNNNNNNNN重復前綴無條件重復REPNNNNNN當相等/為零時重復REPE/RPZNNNNNN當不等/不為零時重復REPNE/PEPNZNNNNNN4.5串操作類指令22十月20231)約定以DS:SI尋址源串,以ES:DI尋址目標串,所以指令中不必顯式指明操作數(shù)。其中源串的段寄存器DS可通過加段超越前綴而改變,但目標串的段寄存器ES不能超越。在32位處理器中,也可以用ESI和EDI做為源和目的串的變址寄存器。2)用方向標志規(guī)定串處理方向。若DF=0(用指令CLD設(shè)置),從低地址向高地址方向處理;若DF=1(用指令STD設(shè)置),則處理方向相反。3)源、目標兩個指針SI和DI在每次操作后都將根據(jù)方向標志DF的值自動增量(DF=0時)或減量(DF=1時),以指向串中下一項。增量/減量的大小由操作串的長度決定:字節(jié)串時SI和DI加/減1,字串時加/減2,雙字串時加/減4,4字串時加/減8
。4)加重復前綴時,必須用CX作為重復次數(shù)計數(shù)器,其中存有被處理數(shù)據(jù)串的字節(jié)個數(shù)或字個數(shù)。指令每執(zhí)行一次,CX值減1,直至減為0結(jié)束。在32/64位處理器中,也可以用ECX/RCX做為串重復次數(shù)寄存器。串操作指令共同點22十月2023一.重復前綴REP/REPE/REPNE/REPZ/REPNZ重復前綴不能單獨使用,只能加在串操作指令之前,用來控制其后的基本串操作指令是否重復。1)在MOVS、LODS、STOS指令前加上前綴指令REP后,就按下列步驟不斷地重復:①若CX=0,則退出REP操作;否則:②CX←CX-1③執(zhí)行REP后面的數(shù)據(jù)串指令④重復①~③2)將REPE/REPZ加在CMPS或SCAS指令之前時,上述重復執(zhí)行步驟①變?yōu)椋孩偃鬋X=0或ZF=0,則停止重復過程。3)將REPNE/REPNZ加在CMPS或SCAS指令之前時,上述重復執(zhí)行步驟①變?yōu)椋孩偃鬋X=0或ZF=1,停止重復過程。22十月2023二.基本串操作指令(1)串傳送指令MOVS/MOVSB/MOVSW/MOVSD/MOVSQ指令格式:MOVS OPRD1,OPRD2MOVSB;字節(jié)串傳送MOVSW;字串傳送MOVSD;雙字串傳送MOVSQ;4字串傳送功能:把DS:SI指定的源串中的一個字節(jié)或字,傳送至由ES:DI指定的目標串。且根據(jù)方向標志DF自動地修改SI、DI,以指向串中的下一個元素。22十月2023例:將數(shù)據(jù)段內(nèi)起始地址在SOURCE(段內(nèi)偏移地址)的一數(shù)據(jù)塊傳送到附加段地址在DEST的存儲單元中去,可用下面的程序段來實現(xiàn)(假設(shè)數(shù)據(jù)塊長度=100字節(jié)):LEA SI,SOURCELEA DI,DESTMOV CX,50 ;設(shè)置循環(huán)操作次數(shù)100/2CLD ;設(shè)置方向標志DF=0GO_ON: MOVSWDEC CXJNZ GO_ON若采用重復前綴,則上述程序簡化為:LEA SI,SOURCELEA DI,DESTMOV CX,50 ;設(shè)置循環(huán)操作次數(shù)CLD ;設(shè)置方向標志DF=0REP MOVSW22十月2023(2)串比較指令CMPS/CMPSB/CMPSW/CMPSD/CMPSQ指令格式:CMPS
OPRD1,OPRD2
CMPSB
;字節(jié)串比較
CMPSW
;字串比較
CMPSD
;雙字串比較
CMPSQ
;4字串比較功能:將DS:SI指定的源串中的元素減去由ES:DI指定的目標串中的相應元素,但兩個存儲單元中的內(nèi)容不變,而是用標志位的變化表示比較結(jié)果,同時根據(jù)方向標志DF自動修改源和目標串指針SI、DI。若CMPS指令前加上前綴REPE/REPZ,則表示:當串未結(jié)尾(CX≠0)且串相等(ZF=1)時繼續(xù)比較;如果CMPS用REPNE/REPNZ作前綴,則表示:當串未結(jié)尾(CX≠0)且串不相等(ZF=0)時繼續(xù)比較。22十月2023例:比較兩個字符串是否有相同的元素,它們的首地址和目標地址分別為SRC和DST,字符串的長度為N個字節(jié)。
CLD
;DF=0,增量方向
LEASI,SRC;字符串首地址送DS:SILEADI,ES:DST;目標地址送ES:DIMOVCX,N;字符串長度
REPNECMPSB;重復比較字符串
JNZNOT_FOUND
;無相同的元素,轉(zhuǎn)NOT_FOUND,否則繼續(xù)執(zhí)行下條指令
……
NOT_FOUND:……若兩個字符串沒有相同的元素,則串比較指令一直重復執(zhí)行,直至(CX)=0為止,并轉(zhuǎn)入下一條條件轉(zhuǎn)移指令JNZ,判斷比較結(jié)果是否為0。顯然,由于未找到相同的元素,因此比較結(jié)果非0,轉(zhuǎn)NOT_FOUND執(zhí)行。
22十月2023(3)串搜索指令SCAS/SCASB/SCASW/SCASD/SCASQ指令格式:SCAS
OPRD
SCASB
;搜索字節(jié)串
SCASW;搜索字串
SCASD ;搜索雙字串
SCASQ ;搜索4字串功能:將累加器(AL或AX)中的內(nèi)容與ES:DI)指定的目標串元素(字節(jié)或字或雙字或4字)進行比較(減法操作),用標志位反映比較的結(jié)果,而不改變累加器和目標串的內(nèi)容,達到字符串搜索的目的,同時自動修改指針DI。在SCAS指令前加有REPE/REPZ前綴,則表示:當串未結(jié)尾(CX≠0)且串元素=關(guān)鍵值(ZF=1)時繼續(xù)搜索。
--用來搜索與給定關(guān)鍵值不同的內(nèi)容。在SCAS指令前加有REPNE/REPNZ前綴,則表示:當串未結(jié)尾(CX≠0)且串元素≠關(guān)鍵值(ZF=0)時繼續(xù)搜索,直到CX=0或ZF=1才執(zhí)行下一條指令。
--可以用來在一個串中查出某一指定元素。22十月2023例:在首地址為ES:DST的字符串中檢查是否有字符'M',字符串的長度為N個字節(jié)。
CLD
;DF=0,增量方向
LEADI,ES:DST
;目標地址送ES:DIMOVCX,N
;字符串長度
MOVAL,‘M’
;搜索字符送ALREPNESCASB
;重復搜索字符串是否有字符'M'
若字符串中沒有字符‘M’,則串掃描指令一直重復執(zhí)行,直至CX=0為止,并轉(zhuǎn)入下一條指令繼續(xù)執(zhí)行。否則,將提前轉(zhuǎn)入下一條指令繼續(xù)執(zhí)行。22十月2023(4)串元素存取指令指令格式:STOS/LODS OPRD
STOSB/LODSB
;存/取字節(jié)串
STOSW/LODSW
;存/取字串
STOSD/LODSD
;存/取雙字串
STOSQ/LODSQ
;存/取4字串STOS將累加器(AL或AX)的內(nèi)容存入由ES:DI指定的目標串中去,同時自動修改DI。指令前可加重復前綴REP,以給一個內(nèi)存塊賦同一個值。LODS將DS:SI指定的源串中的元素,傳送到AL(字節(jié)操作)或AX(字操作)寄存器中,同時自動修改SI。22十月2023例:將首地址為DS:SRC的32位數(shù)據(jù)串中值為87654321H的元素送到首地址為ES:DST的內(nèi)存區(qū)中。字符串長度為1000H字節(jié)。
CLD
;DF=0,增量方向
LEAESI,SRC
;字符串首地址送DS:SILEAEDI,ES:DST
;目標地址送ES:DIMOVECX,400H
;字符串長度1000H/4=400HCONTINUE:LODSD
;取字符串的一個元素
CMPEAX,87654321H;字符串元素為87654321H嗎?JNENEXT
;不是,繼續(xù)取下一個元素
STOSD
;是,存入首地址為ES:DST的內(nèi)存區(qū)中NEXT:DECECXJNZCONTINUE利用DEC和JNZ指令控制串操作指令的重復執(zhí)行次數(shù)。當(ECX)≠0時,程序重復循環(huán),直至(ECX)=0為止。22十月20234.6控制轉(zhuǎn)移類指令一.無條件轉(zhuǎn)移指令JMP指令格式:JMP 目標標號JMP指令有以下5種形式:(1)段內(nèi)直接短轉(zhuǎn)移:JMP
SHORTlable
功能:無條件地轉(zhuǎn)移到lable所指定的目標地址。短(SHORT)轉(zhuǎn)移時,目標地址與JMP指令的下一條指令地址之差在-128~127字節(jié)之間,即跳轉(zhuǎn)地址的偏移范圍為8位帶符號二進制數(shù)范圍,屬于相對轉(zhuǎn)移。(2)段內(nèi)直接近轉(zhuǎn)移:JMP
NEARPTRlable
功能:無條件轉(zhuǎn)移到目標地址lable。跳轉(zhuǎn)地址的偏移范圍為16位帶符號二進制數(shù)的范圍,即±32K,屬于相對轉(zhuǎn)移。(3)段內(nèi)間接轉(zhuǎn)移:JMPreg或JMP mem
功能:無條件轉(zhuǎn)移到由寄存器的內(nèi)容指定的目標地址,或由寄存器間接尋址、基址變址、相對基址變址提供的存儲單元內(nèi)容所指定的目標地址,是一種絕對轉(zhuǎn)移指令。22十月2023例:MOV
BX,1000H
JMP
BX ;程序?qū)⑥D(zhuǎn)向1000H,即IP←1000H
JMP
WORDPTR[BX+20H]設(shè)DS=2000H,[21020H]=34H,[21021H]=12H,則第二個JMP將程序轉(zhuǎn)向1234H,即IP=1234H。(4)段間直接轉(zhuǎn)移:JMP FARPTRlable功能:無條件轉(zhuǎn)移到指定段內(nèi)的目標地址lable,是絕對轉(zhuǎn)移指令。例:CODE1 SEGMENT CODE2
SEGMENT
…
…
JMP FARPTRDEST DEST:… …
…
CODE1ENDS CODE2 ENDS目標地址也可直接用數(shù)值表達式給出,這時可省略FAR屬性說明。
JMPFARPTR2000H:0100H 程序?qū)⑥D(zhuǎn)向段地址為2000H,偏移地址為0100H的單元22十月2023(5)段間間接轉(zhuǎn)移:JMP mem功能:程序?qū)⑥D(zhuǎn)向由mem指定的雙字指針中第一個字單元的內(nèi)容作為IP,第二個字單元的內(nèi)容作為CS的目標地址。例:MOV SI,0100H
JMP DWORDPTR[SI]把DS:[SI]即DS:0100H和DS:0101H兩單元的字送IP,而把DS:0102H和DS:0103H兩單元的字送CS。程序轉(zhuǎn)入由新的CS和新的IP決定的目標地址。在32位保護模式下,段內(nèi)轉(zhuǎn)移的目標地址為32位偏移地址,段間轉(zhuǎn)移的目標地址為48位虛擬地址(16位段選擇符:32偏移地址)。例:JMPEBX;段內(nèi)轉(zhuǎn)移,EIP=EBXJMPFWORDPTR[EBX];段間轉(zhuǎn)移,目標地址為[EBX]指向的48位虛擬地址,
;CS=其中的高16位,EIP=其中的低32位22十月2023在64位模式下,指令指針為RIP。JMP指令的執(zhí)行分為相對轉(zhuǎn)移和絕對轉(zhuǎn)移兩種情況:若為相對轉(zhuǎn)移,則用RIP寄存器與機器碼中的位移量字段相加的和修改RIP值,此時位移量字段不能超過32位,并將其符號擴展為64位再相加;若為絕對轉(zhuǎn)移,則把機器碼中指出的寄存器或內(nèi)存單元的值直接填入RIP(若不足64位將進行0擴展),實現(xiàn)64位地址空間的轉(zhuǎn)移?!纠縅MP30000H
;若原來RIP=20000H,則將RIP加10000H,實現(xiàn)相對轉(zhuǎn)移
JMPR15;程序?qū)⑥D(zhuǎn)向R15指向的地址,即RIP←R15,實現(xiàn)絕對轉(zhuǎn)移22十月2023二.條件轉(zhuǎn)移類指令(1)根據(jù)單個標志位的條件轉(zhuǎn)移指令
JCTAB1 ;當(AX-BX)有借位時,轉(zhuǎn)至TAB1。
CMPCX,DXJNETAB2;當CX≠DX(即CX-DX≠0)時,轉(zhuǎn)至TAB2。指令名稱說明助記符測試條件等于/結(jié)果為零轉(zhuǎn)移相等/等于零JE/JZ目標標號ZF=1不等于/結(jié)果不為零轉(zhuǎn)移不相等/不等于零JNE/JNZ目標標號ZF=0有進位/有借位轉(zhuǎn)移有進位/借位JC目標標號CF=1無進位/無借位轉(zhuǎn)移無進位/借位JNC目標標號CF=0溢出轉(zhuǎn)移有溢出JO目標標號OF=1不溢出轉(zhuǎn)移無溢出JNO目標標號OF=1奇偶性為1/為偶轉(zhuǎn)移有偶數(shù)個“1”JP/JPE目標標號PF=1奇偶性為0/為奇轉(zhuǎn)移有奇數(shù)個“1”JNP/JPO目標標號PF=0符號位為1轉(zhuǎn)移是負數(shù)JS目標標號SF=1符號位為0轉(zhuǎn)移是正數(shù)JNS目標標號SF=022十月2023(2)用于無符號數(shù)比較的條件轉(zhuǎn)移指令表3.9中的11~14條指令,檢測無符號數(shù)比較結(jié)果的特征標志CF和ZF。例:比較無符號數(shù)FEH和01H的大小,執(zhí)行下面的指令后,將轉(zhuǎn)移到ABOVE處繼續(xù)執(zhí)行指令。
MOVAL,0FEHCMPAL,01HJAABOVE
……ABOVE:……指令名稱說明助記符測試條件高于/不低于也不等于轉(zhuǎn)移無符號數(shù)A>BJA/JNBE目標標號CF=0且ZF=0高于或等于/不低于轉(zhuǎn)移無符號數(shù)A≥BJAE/JNB目標標號CF=0低于/不高于也不等于轉(zhuǎn)移無符號數(shù)A<BJB/JNAE目標標號CF=1低于或等于/不高于轉(zhuǎn)移無符號數(shù)A≤BJBE/JNA目標標號CF=1或ZF=122十月2023(3)用于有符號數(shù)比較的條件轉(zhuǎn)移指令表3.9中的最后四條指令檢測的是SF、OF以及ZF標志,表示兩個有符號數(shù)間的大小關(guān)系。例:比較有符號數(shù)FEH和01H的大小,下面的指令,將不轉(zhuǎn)移到greater,而是繼續(xù)執(zhí)行JG下面的一條指令,因為有符號數(shù)0FEH<01H。
MOVAL,0FEHCMPAL,01HJGGREATER指令名稱說明助記符測試條件大于/不小于也不等于轉(zhuǎn)移有符號數(shù)A>BJG/JNLE目標標號SF⊕OF=0且ZF=0大于或等于/不小于轉(zhuǎn)移有符號數(shù)A≥BJGE/JNL目標標號SF⊕OF=0或ZF=1小于/在大于也不等于轉(zhuǎn)移有符號數(shù)A<BJL/JNGE目標標號SF⊕OF=1且ZF=0小于或等于/不大于轉(zhuǎn)移有符號數(shù)A≤BJLE/JNG目標標號SF⊕OF=1或ZF=122十月2023三.調(diào)用與返回指令1.調(diào)用指令CALL指令格式:CALL OPRD
用于調(diào)用子程序(或過程)OPRD,它和JMP指令相似。⑴段內(nèi)直接調(diào)用操作:PUSHIP;IP入棧
(IP)←(IP)+16位位移量;轉(zhuǎn)向子程序入口22十月2023⑵段內(nèi)間接調(diào)用(CALLNEARPTRDST)操作:PUSHIP;IP入棧
(IP)←(EA);轉(zhuǎn)向子程序入口
----IP的值不是CALL指令的下一條指令地址加上16位位移量,而是直接將DST的有效地址送入IP,這是一種絕對調(diào)用指令。例:
CALLBX;EA在BX中
CALLWORDPTR[BX];EA在字存儲單元中22十月2023⑶段間直接調(diào)用(CALLFARPTRDST)操作:PUSHCS;CS入棧
PUSHIP;IP入棧
(IP)←偏移地址;IP由指令中的偏移地址取代
(CS)←段地址;CS由指令中的段地址取代其一:調(diào)用時不僅要保護偏移地址,而且要保護段地址,先CS壓棧,然后IP壓棧;其二:CS和IP的值不是用CALL指令的下一條指令地址加上位移量取代,而是直接將DST的段地址和偏移地址送入CS:IP,是一種絕對調(diào)用指令。例:
CALL1000H:0100HCALLFARPTRSUB_PROC22十月2023⑷段間間接調(diào)用(CALLFARPTRDST)操作:PUSHCS;CS入棧
PUSHIP;IP入棧
(IP)←(EA);IP由指令中的偏移地址取代
(CS)←(EA+2);CS由指令中的段地址取代
是絕對調(diào)用指令,根據(jù)尋址方式求出EA后,把指定存儲單元的字內(nèi)容送到IP,下一個字的內(nèi)容送到CS。22十月20232.返回指令RET指令格式:RET
或RET imm16用以返回到調(diào)用這個子程序的斷點處,作為子程序或過程的最后一條指令,。若是段內(nèi)返回,則把棧頂?shù)囊粋€字彈出至IP,恢復調(diào)用時斷點處的偏移地址;若為段間返回,則除了彈出IP外,還要從當前棧頂繼續(xù)彈出一個字到CS,恢復斷點
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年貨物運輸合同規(guī)定運輸方式與責任
- 2025年度歷史建筑保護拆墻工程合作協(xié)議4篇
- 2024豬場租賃承包合同
- 2024節(jié)能減排協(xié)議書
- 《中樞性高熱患者的護理與治療》課件
- 2025年度新媒體運營與公關(guān)合作服務(wù)合同范本4篇
- 2024年05月云南廣發(fā)銀行昆明分行招考筆試歷年參考題庫附帶答案詳解
- 2025年度大數(shù)據(jù)分析服務(wù)合同樣本8篇
- 2025變頻器代理商銷售合同:市場拓展與品牌推廣合作3篇
- 二零二五年度高端酒店集團食材供應與服務(wù)合同3篇
- 常見老年慢性病防治與護理課件整理
- 履約情況證明(共6篇)
- 云南省迪慶藏族自治州各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細
- 設(shè)備機房出入登記表
- 六年級語文-文言文閱讀訓練題50篇-含答案
- 醫(yī)用冰箱溫度登記表
- 零售學(第二版)第01章零售導論
- 大學植物生理學經(jīng)典05植物光合作用
- 口袋妖怪白金光圖文攻略2周目
- 光伏發(fā)電站集中監(jiān)控系統(tǒng)通信及數(shù)據(jù)標準
- 三年級下冊生字組詞(帶拼音)
評論
0/150
提交評論