匯編指令索引_第1頁(yè)
匯編指令索引_第2頁(yè)
匯編指令索引_第3頁(yè)
匯編指令索引_第4頁(yè)
匯編指令索引_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、學(xué)習(xí)匯編語(yǔ)言,最關(guān)鍵的就在于匯編指令集的掌握以及計(jì)算機(jī)工作方式的理解, 以下是80X86匯編過程中經(jīng)常用到的一些匯編指令。從功能分類上來(lái)說,一共可分為一、數(shù)據(jù)傳送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。二、算術(shù)指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。三、邏輯指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。四、控制轉(zhuǎn)移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOP

2、NE、CALL、RET、INT。五、串操作指令:MOVS、LODS、STOS、CMPS、SCAS。六、標(biāo)志處理指令:CLC、STC、CLD、STD。七、32位CPU新增指令(后續(xù)補(bǔ)充并完善)除上述的一些指令外,還有許多32位80X86CPU新增指令,這些指令有時(shí)會(huì)簡(jiǎn) 化程序設(shè)計(jì),不過由于我也是剛剛學(xué)習(xí)匯編,這些都是從書上看到的,所以很 多還不是十分了解,我寫這些的目的僅僅是想讓自己能更好的去記住這些指令 的作用和用法,同事也希望和我一樣剛?cè)腴T的朋友能夠多了解一些,并沒有其 他目的,所有的示例也并沒有經(jīng)過實(shí)際的代碼測(cè)試,所以希望各位朋友,不管 你喜歡不喜歡,反對(duì)不反對(duì),請(qǐng)文明發(fā)言,謝謝!數(shù)據(jù)傳送

3、指令開始 1、MOV(傳送)指令寫法:MOV target,source功能描述:將源操作數(shù)source的值復(fù)制到target中去,source值不變注意事項(xiàng):1)target不能是CS (代碼段寄存器),我的理解是代碼段不可寫, 只可讀,所以相應(yīng)這地方也不能對(duì)CS執(zhí)行復(fù)制操作。2)target和source不能 同時(shí)為內(nèi)存數(shù)、段寄存器(CSDSESSSFSGS)3)不能將立即數(shù)傳送給段寄存 器4)target和source必須類型匹配,比如,要么都是字節(jié),要么都是字或者 都是雙字等。4)由于立即數(shù)沒有明確的類型,所以將立即數(shù)傳送到target時(shí), 系統(tǒng)會(huì)自動(dòng)將立即數(shù)零擴(kuò)展到與target數(shù)的

4、位數(shù)相同,再進(jìn)行傳送。有時(shí),需 要用BYTE PTR、WORD PTR、DWORD PTR明確指出立即數(shù)的位數(shù)寫法示例:MOV dl,01H;MOV eax,bp; eax =ss:bp雙字傳送。2、XCHG(交換)指令寫法:XCHG objectl , object?功能描述:交換objectl與object?的值注意事項(xiàng):1 )不能直接交換兩個(gè)內(nèi)存數(shù)的值2 )類型必須匹配3 )兩個(gè)操作數(shù) 任何一個(gè)都不能是段寄存器【看來(lái)段寄存器的寫入的限制非常的嚴(yán)格,MOV指 令也不能對(duì)段寄存器進(jìn)行寫入】,4)必須是通用寄存器(ax、bx、cx、dx、si、 di)或內(nèi)存數(shù)寫法示例:XCHG ax,bxsi

5、; XCHG ax,bx;3、LEA(裝入有效地址)指令寫法:LEZ reg16,mem功能描述:將有效地址MEM的值裝入到16位的通用寄存器中。寫法示例:假定 bx=5678H,EAX=1,EDX=2Lea si,2bx;si=567AHLea di,2eaxedx ;di=5注意,這里裝入的是有效地址,并不是實(shí)際的內(nèi)存中的數(shù)值,如果要想取內(nèi)存 中該地址對(duì)應(yīng)的數(shù)值,還需要加上段地址才行,而段地址有可能保存在DS中, 也有可能保存在SS或者CS中哦:不知道我的理解可正確。4、LDSLESLGSLSS (注意,與LEA不同的是,這里是裝入的值,而不是有 交攵地址)這幾個(gè)指令,名稱不同,作用差不多

6、。寫法:LDS reg16 , mem32功能描述:reg16等于mem32的低字,而DS對(duì)應(yīng)于mem32的高字(當(dāng)為L(zhǎng)ES 時(shí),這里就是ES對(duì)應(yīng)于mem32的高字)用來(lái)給一個(gè)段寄存器和一個(gè)16位通用寄存器同時(shí)復(fù)制。注意事項(xiàng):第一個(gè)操作數(shù)必須是16位通用寄存器在接著往下說之前,先熟悉下堆棧的概念。堆棧,位于內(nèi)存的堆棧段中,是內(nèi) 存的一部分,具有“先進(jìn)后出”的特點(diǎn),堆棧只有一個(gè)入口,即當(dāng)前棧頂,當(dāng) 堆棧為空時(shí),棧頂和棧底指向同一內(nèi)存地址,在WINDOWS中,可以把堆棧 理解成一個(gè)倒著的啤酒瓶,上面的地址大,下面的地址小,當(dāng)從瓶口往啤酒瓶 塞啤酒時(shí)(進(jìn)棧),棧頂就會(huì)往瓶口下移動(dòng),也就是往低地址方向

7、移動(dòng),同理, 出棧時(shí),正好相反,把啤酒給倒出來(lái),棧頂向高地址方向移動(dòng)。這就是所謂的 堆棧,哼哼,很Easy吧。在匯編語(yǔ)言中,堆棧操作的最小單位是字,也就是說,只能以字或雙字為單位, 同時(shí),SS : SP指向棧頂(SS為堆棧段寄存器,SP為堆棧指針,二者一相加, 就構(gòu)成了堆棧棧頂?shù)膬?nèi)存地址)。5、PUSH (進(jìn)棧)寫法:PUSH reg16( 32)/seg/mem16( 32)/imm功能描述:將通用寄存器/段寄存器/內(nèi)存數(shù)/立即數(shù)的值壓入棧中,即: SP=SP-2 SS:SP = 16位數(shù)值(當(dāng)將32位數(shù)值壓入棧中時(shí),SP=SP-4, SS:SP = 32 為數(shù)值)6、POP (出棧)寫法:

8、POP reg16( 32)/seg/mem16( 32)【不能出棧到CS中】功能描述:將堆??诘?6(32)位數(shù)據(jù)推出到通用寄存器/段寄存器/內(nèi)存中, 即:寄存器/段寄存器/內(nèi)存=SS:SP SP=SP+2 (當(dāng)將32位數(shù)值出棧時(shí), SP=SP+4)(注意,不能出棧給立即數(shù)哦,常量不可變嘛)7、PUSHA、PUSHAD、POPA、POPAD作用:將所有16/32位通用寄存器進(jìn)棧/出棧如:PUSHA ;將 AX、CX、DX、BX、原 SP、BP、SI、DI 依次進(jìn)棧。POPA 出 棧順序正好相反,但要注意的是,彈出到SP的值被丟棄,SP通過增加16位 來(lái)恢復(fù)(當(dāng)然嘛,不然棧頂?shù)刂肪捅恍薷牧?,?/p>

9、會(huì)出息不對(duì)齊的情況,就有可 能亂套了)POPAD PUSHAD 一樣,只不過是32位的罷了。8、PUSHF、PUSHFD、POPF、POPFD功能描述:標(biāo)志寄存器FLAGS( EFLAGS)進(jìn)?;虺鰲H纾篜USHF ; FLAGS進(jìn)棧POPF ;棧頂字出棧到FLAGS總結(jié)下,POP和PUSH通??梢杂脕?lái)交換兩個(gè)寄存器的值,也可以用來(lái)保護(hù)寄 存器的值,如下:交換 ax 與 cx 的值:push ax ; push cx ; pop ax ; pop cx ;保護(hù)寄存器:push ax ; push cx ;.中間有很多執(zhí)行的代碼.pop cx;pop ax;9、LAHFSAHF (標(biāo)志寄存器傳送

10、指令)寫法:lahf ;作用:AH二FLAGS的低8位寫法:sahf ;作用:FLAGS的低8 =AH10、符號(hào)擴(kuò)展和零擴(kuò)展指令CBW ; AL符號(hào)擴(kuò)展為AXCWD ; AX符號(hào)擴(kuò)展為32位數(shù)DX:AXCWDE;AX符號(hào)擴(kuò)展為EAX;CDQ : EAX符號(hào)擴(kuò)展為64位數(shù)EDX:EAXMOVSX (符號(hào)擴(kuò)展指令的一般形式)寫法:MOVSX reg1632 , reg8reg16mem8mem16作用:用來(lái)將8位符號(hào)擴(kuò)展到16位,或者16位符號(hào)擴(kuò)展到32位 MOVZX (零擴(kuò)展指令)寫法:MOVZX reg1632,reg8reg16mem8mem16零擴(kuò)展,就是高位補(bǔ)0進(jìn)行擴(kuò)展。通常用在將數(shù)據(jù)復(fù)

11、制到一個(gè)不同的 寄存器中,如入1零擴(kuò)展為EBX。相同寄存器的零擴(kuò)展,可以使用 MOV高位,0來(lái)實(shí)現(xiàn)。11、BSWAP(字節(jié)交換)寫法:bswap reg32作用:將reg32的第0與第3個(gè)字節(jié),第1與第2個(gè)字節(jié)進(jìn)行交換。示例:設(shè) EAX=12345678h執(zhí)行 bswap eax ;后,eax=78563412H12、XLAT (換碼)寫法:XLAT;作用:AL=DS:bx+AL將DS:BX所指內(nèi)存中的由AL指定位移處的一個(gè)字節(jié)賦值給ALO(貌 似這是一個(gè)方便偷懶的指令哦。),原來(lái)它的主要用途是查表。注 意可以給它提供操作數(shù),用來(lái)指定使用哪個(gè)段地址,如: XLAT ES : table ;使用

12、ES來(lái)作為段地址,table不起作用。XLAT table ;使用table所在段對(duì)應(yīng)的段寄存器作為段地址。數(shù)據(jù)傳送指令結(jié)束算術(shù)指令開始13、ADD (加法)寫法:ADD reg/mem reg/mem/imm作用:將后面的操作數(shù)加到前面的操作數(shù)中注意:兩個(gè)操作數(shù)必須類型匹配,并且不能同時(shí)是內(nèi)存操作數(shù)ADC (帶進(jìn)位加法)寫法:ADC reg/mem, reg/mem/imm ;作用:dest二dest+src+cf當(dāng)CF=0時(shí)ADD與ADC的作用是相同的。示例:實(shí)現(xiàn)64位數(shù)EDX:EAX與ECX:EBX的加法:Add EAX,EBX ;ADC EDX,ECX;14、INC(自加一)寫法:IN

13、C reg/mem ;作用:dest=dest+1 ;15、XADD (交換加)寫法:XADD reg/mem,reg作用:先將兩個(gè)數(shù)交換,然將二者之和送給第一個(gè)數(shù)16、SUB(減法)寫法:SUB reg/mem,reg/mem/imm ;作用:dest二dest-src ;SBB (帶借位減法)寫法:SBB reg/mem,reg/mem/imm作用:dest二dest-src-cf ;注意:兩個(gè)操作數(shù)必須類型匹配,且不能同時(shí)是內(nèi)存數(shù)17、DEC(自減 1)寫法:DEC reg/mem ;作用:dest二dest-1 ;18、CMP(比較)寫法:CMP reg/mem,reg/mem/imm

14、作用:dest-src注意:這里并不將結(jié)果存入dest中,而僅僅是執(zhí)行相減的運(yùn)算,達(dá)到 依據(jù)運(yùn)算結(jié)果去影響EFLAG標(biāo)志位的效果19、NEG(求補(bǔ))寫法:NEG reg/mem作用:求補(bǔ)就是求相反數(shù),即:dest=0-dest ;20、CMPXCHG(比較交換)寫法:CMPXCHG reg/mem,reg ;作用:AL/AX/EAX-oprd1,如果等于 0,則 oprd1=oprd2,否則, AL/AX/EAX=oprd1 ;即:比較AL/AX/EAX與第一個(gè)操作數(shù),如果相等,則置ZF=1,并復(fù) 制第二個(gè)操作數(shù)給第一個(gè)操作數(shù);否則,置ZF=0,并復(fù)制第一個(gè)操作 數(shù)給 AL/AX/EAX。說明

15、:CMPXCHG主要為實(shí)現(xiàn)原子操作提供支持CMPXCHG8B( 8字節(jié)比較交換指令)寫法:CMPXCHG8B MEM64;功能:將EDX:EAX中的64位數(shù)與內(nèi)存的64位數(shù)進(jìn)行比較,如果相等,則置ZF=1,并存儲(chǔ)ECX:EBX到mem64指定的內(nèi)存地址;否則,置ZF=0,并設(shè)置EDX:EAX為mem64的8字節(jié)內(nèi)容21、MUL(無(wú)符號(hào)乘法)寫法:MUL reg/mem ;作用:當(dāng)操作數(shù)為8位時(shí),AX=AL*src ;當(dāng)操作數(shù)為16位時(shí),DX:AX=AX*src ;當(dāng)操作數(shù)為32位時(shí),EDX:EAX=EAX*src ;22、IMUL(帶符號(hào)位乘法)寫法:IMUL reg/mem ;(作用同上)I

16、MUL reg16,reg16/mem16,imm16 ;IMUL reg32,reg32/mem32,imm32 ;IMUL reg16,imm16/reg16/imm16 ;IMUL reg32,reg32/mem32/imm32 ;注意:沒有兩個(gè)操作數(shù)均為8位的多操作數(shù)乘法。對(duì)于同一個(gè)二進(jìn)制數(shù),采用MUL和IMUL執(zhí)行的結(jié)果可能不同,設(shè) AL=0FF,BL=1,分別執(zhí)行下面的指令,會(huì)得到不同的結(jié)果: Mul bl ; AX=0FFH(255);Imul bl ; AX=0FFFFH(-1)(高一半為低一半的擴(kuò)展)23、DIV(無(wú)符號(hào)除法)/IDIV(帶符號(hào)數(shù)除法)寫法:DIV reg/m

17、em ; /IDIC reg/mem作用:如果操作數(shù)是8位,AX%SRC,結(jié)果商在AL、余數(shù)在AH中; 如果操作數(shù)是16位,DX:AX%SRC,結(jié)果商在AX,余數(shù)在DX中; 如果操作數(shù)是32位,EDX:EAX%SRC,結(jié)果商在EAX,余數(shù)在EDX中; 注意:不能直接實(shí)現(xiàn)8位數(shù)除8位數(shù)、16位數(shù)除16位數(shù)、32除32, 若需要這樣,則必須先把除數(shù)符號(hào)擴(kuò)展或零擴(kuò)展到16、32、64位, 然后用除法指令。對(duì)于IDIV,余數(shù)和被除數(shù)符號(hào)相同,如:-5 IDIV 2 =商-2,余數(shù):- 1;在下列情況下,會(huì)使CPU產(chǎn)生中斷:一:除數(shù)為0 ;二:由于商太大, 導(dǎo)致EAXAX或AL不能容納,從而產(chǎn)生了溢出。

18、BCD碼調(diào)整指令(十進(jìn)制調(diào)整指令)待補(bǔ)充24、關(guān)于BCD碼:BCD碼就是一種十進(jìn)制數(shù)的二進(jìn)制編碼表示,分為壓縮 BCD碼和非壓縮BCD碼,壓縮BCD碼用4個(gè)二進(jìn)制位表示一個(gè)十進(jìn)制位,即 用 0000B1001B 表示十進(jìn)制 09,如 0110 0100 0010 1001B 表示 6429 用8位二進(jìn)制來(lái)表示一個(gè)十進(jìn)制叫非壓縮BCD碼,其中,低四位與壓縮BCD 碼相同,高四位無(wú)意義。壓縮BCD碼調(diào)整指令包括DAA(加法的壓縮BCD碼調(diào)整)和DAS(減法的壓縮 BCD碼調(diào)整) 寫法:DAA;作用:調(diào)整AL中的和為壓縮BCD碼。功能:使用DAA指令時(shí),通常先執(zhí)行ADD/ADC指令,將兩個(gè)壓縮BCD

19、碼相 加,結(jié)果存放在AL中,然后使用該指令將AL調(diào)整為壓縮BCD碼格式。DAA的調(diào)整算法:IF(AL低 4 位9 或 AF=1)THENAL=AL+6;AF=1;ENDIFIF( AL 高 4 位9 或 CF=1)THENAL=AL+60H;CF=1;ENDIF說明:CF反映壓縮BCD碼相加的進(jìn)位。DAS;作用:調(diào)整AL中的差為壓縮BCD碼。功能:使用DAS指令時(shí),通常先執(zhí)行SUB/SBB指令,將兩個(gè)壓縮BCD碼相 減,結(jié)果存放在AL中,然后使用該指令將AL調(diào)整為壓縮BCD碼格式。DAS的調(diào)整算法:IF(AL低 4 位9 或 AF=1)THENAL=AL-6;AF=1;ENDIFIF( AL

20、高 4 位9 或 CF=1)THENAL=AL-60H;CF=1;ENDIF說明:CF反映壓縮BCD碼相減的借位。特別注意,如果使用DAA或DAS指令,則參加加法或減法運(yùn)算的操作數(shù)應(yīng)該 是壓縮BCD碼,如果將任意兩個(gè)二進(jìn)制數(shù)相加或相減,然后調(diào)整,則得不到正 確的結(jié)果。關(guān)鍵是調(diào)整的規(guī)則,其中AF標(biāo)志位就是專門為BCD碼調(diào)整設(shè)計(jì)的,當(dāng)?shù)退奈?有向高四位進(jìn)位或借位時(shí),值為1。而CF就是最高位有進(jìn)位或者借位時(shí),為1. 非壓縮BCD碼調(diào)整指令,包括AAA,AAS,AAM,AAD。寫法:AAA ;作用:調(diào)整AL中的和為非壓縮BCD碼;調(diào)整后,AL高4位等于0 ,AH=AH+產(chǎn)生的CF功能:使用AAA指令時(shí)

21、,通常先執(zhí)行ADD/ADC指令,以AL為目的操作數(shù), 將兩個(gè)非壓縮BCD碼(與高位無(wú)關(guān))相加,然后使用AAA將AL調(diào)整為非壓 縮BCD碼格式,且高4位等于0,同時(shí),將調(diào)整產(chǎn)生的進(jìn)位加到AH中。AAA調(diào)整算法:IF(AL低 4 位9 或者 AF=1)THENAL=AL+6;AH=AH + 1;AF=1;CF=1;ELSEAF=0;CF=0;ENDIFAL=AL AND OFH;AL 高 4 位清 0寫法:AAS ;作用:調(diào)整AL中的差為非壓縮BCD碼;調(diào)整后,AL高4位等于0,AH=AH-產(chǎn)生的CF功能:使用AAS指令時(shí),通常先執(zhí)行SUB/SBB指令,以AL為目的操作數(shù), 將兩個(gè)非壓縮BCD碼(

22、與高位無(wú)關(guān))相減,然后使用AAS將AL調(diào)整為非壓 縮BCD碼格式,且高4位等于0,同時(shí),將調(diào)整產(chǎn)生的借位從AH中減去。 AAA調(diào)整算法:IF(AL低 4 位9 或者 AF=1)THENAL=AL-6 ;AH=AH-1 ;AF=1;CF=1;ELSEAF=0;CF=0;ENDIFAL=AL AND OFH;AL 高 4 位清 0寫法:AAM ;作用:AH=AX DIV 10, AL=AX MOD 10;功能:使用AAM時(shí),通常先執(zhí)行MUL/IMUL指令,將兩個(gè)一字節(jié)非壓縮 BCD碼(高四位必須為0)相乘,結(jié)果存入AX.然后使用AAM指令將AX (AH=0)調(diào)整為兩字節(jié)壓縮BUC碼格式。寫法:AA

23、D;作用:AL=AH*10+AL,AH=0;功能:使用AAD時(shí),通常先執(zhí)行該指令,將AX中的兩字節(jié)非壓縮BCD碼 (AH與AL的高4位必須為0)調(diào)整為相應(yīng)的二進(jìn)制表示,然后使用 DIV/IDIV指令,除以一個(gè)一字節(jié)的非壓縮BCD碼(高四位必須為0),可得 到非壓縮BCD碼的除法結(jié)果。特別注意,參加非壓縮BCD碼乘法或除法的操作數(shù)高4位必須為0。算術(shù)指令結(jié)束位操作指令開始25、ANDORXORNOTTEST寫法:AND reg/mem,reg/mem/imm;OR reg/mem,reg/mem/imm;XOR reg/mem,reg/mem/imm;NOT reg/mem;TEST reg/m

24、em,reg/mem/imm;作用:ANDTESTORXOR,兩個(gè)操作數(shù)必須類型匹配,而且不能同 時(shí)是內(nèi)存操作數(shù)。XOR通常用來(lái)將寄存器清0,如XOR AX,AX;TEST與AND的關(guān)系類似于CMP與SUB。TEST的典型用法是檢查 某位是否為1,如:TEST DX,109H ;若DX的第0,3,8位至少有一位為1,則ZF=0,否則ZF=1 ;26、移位指令SHL(邏輯左移)寫法:SHL REGmem , 1CL ;作用:將dest的各個(gè)二進(jìn)制位向左移動(dòng)1 (CL)位,并將DEST的最 高位移出到CF,最低位移入0。SAL (算術(shù)左移)寫法:SAL REGmem,1CL ;作用:將dest的各

25、個(gè)二進(jìn)制位向左移動(dòng)1( CL)位,并將DEST的最 高位移出到CF,最低位移入0(同SHL)。SHR (邏輯右移)寫法:SHR REGmem,1CL ;作用:將dest的各個(gè)二進(jìn)制位向左移動(dòng)1( CL)位,并將DEST的最 低位移出到CF,最高位移入0。SAR(算 右移)寫法:SAR REGmem,1CL ;作用:將dest的各個(gè)二進(jìn)制位向左移動(dòng)1( CL)位,并將DEST的最 低位移出到CF,最高位不變。SHLD(雙精度左移)寫法:SHLD REG16/REG32/MEM16/MEM32, REG16/REG32,IMM8/CL;(類型須匹配)作用:將OPRD1的各二進(jìn)制左移,并將oprd1

26、的最高位移到 CF,oprd2的最高位移到oprd1的最低位,但是,oprd2的值不變。 SHRD(雙精度右移)寫法與作用與雙精度左移類似。注意移動(dòng)方向?yàn)橛乙啤R陨衔灰浦噶顚?duì)標(biāo)志位的影響:若移位后符號(hào)位發(fā)生了變化,則OF=1,否則OF=0;CF為最后移入位; 按一般規(guī)則影響ZF與SF。然而,若移位次數(shù)為0,則不影響標(biāo)志位; 若移位次數(shù)大于1,則OF無(wú)定義。27、循環(huán)移位指令ROL(循環(huán)左移)寫法:ROL REGMEM, 1CL ;或 ROL REG/MEM,IMM8;(類型可不 匹配)作用:將DEST的各二進(jìn)制位向左移動(dòng),并將最高位移出到CF,并同時(shí) 移入最低位。ROR(循環(huán)右移)寫法:ROR

27、 REGMEM, 1CL ;或 ROR REG/MEM,IMM8;(類型可不匹配)作用:將DEST的各二進(jìn)制位向右移動(dòng),并將最低位移出到CF,并同時(shí) 移入最高位。RCL(帶進(jìn)位循環(huán)左移)寫法:RCL REGMEM, 1CL ;或 RCL REG/MEM,IMM8;(類型可不匹配)作用:將DEST的各二進(jìn)制位向左移動(dòng),并將最高位移出到CF,原CF移入最低位。RCR(帶進(jìn)位循環(huán)右移)寫法:RCR REGMEM, 1CL ;或 RCR REG/MEM,IMM8;(類型可不匹配)作用:將DEST的各二進(jìn)制位向右移動(dòng),并將最低位移出到CF,原CF移入最高位。28、位測(cè)試指令BT (位測(cè)試)寫法:BT R

28、EG16/MEM16,REG16/IMM8;或 BTREG32/MEM32,REG32/IMM8;作用:CF=DEST的第index位,dest不變。BTS(位測(cè)試并置位)寫法:BTS REG16/MEM16,REG16/IMM8;或 BTSREG32/MEM32,REG32/IMM8;作用:CF=DEST 的第 index 位,dest 的第 index 位二1 ;BTR(位測(cè)試并復(fù)位)寫法:BTR REG16/MEM16/REG16/IMM8;或 BTR REG32/MEM32,REG32/IMM8;作用:CF=DEST 的第 index 位,dest 的第 index 位二0 ;BTC(

29、位測(cè)試并復(fù)位)寫法:BTC REG16/MEM16,REG16/IMM8;或 BTCREG32/MEM32,REG32/IMM8;作用:CF二DEST的第index位,dest的第index位取反;說明:若dest為寄存器,則以index除以16 ( dest為reg16 )或32( dest為reg32)的余數(shù)作為測(cè)試位。當(dāng)然,index最好不要超出 操作數(shù)的位數(shù)。若dest為內(nèi)存操作數(shù),則無(wú)論其類型為字或雙字,測(cè)試位為相對(duì)于起 始地址的位移,例如,設(shè)BX=50,X為字類型的變量,則執(zhí)行指令BT X,BX ;后,CF=X+6單元的第2位,因?yàn)?0%8=6余2.BTS、BTC、BTR指令可用于

30、并發(fā)程序設(shè)計(jì)。29、位掃描指令BSF(前向位掃描)寫法:BSF reg16/reg32,reg16/reg32/mem16/mem32 ;(類型須匹配)作用:dest二src中值為1的最低位編號(hào)(從低位向高位搜索)BSR(后向位掃描)寫法:BSR reg16/reg32,reg16/reg32/mem16/mem32 ;(類型須匹配)作用:dest二src中值為1的最高位編號(hào)(從高位向低位搜索)說明:BSF和BSR搜索SRC操作數(shù)中首次出現(xiàn)1的位置,BSF從低位向高位 搜索,BSR反之。若找到一個(gè)1,則置ZF=0,并存儲(chǔ)位編號(hào)到DEST操作數(shù) 中。若SRC=0,即沒有1出現(xiàn),則置ZF=1,且d

31、est的值不確定。比如,有如下二進(jìn)制數(shù)0111 1111 1010 0100執(zhí)行bsf后,位編號(hào)為2,執(zhí)行bsr后,位編號(hào)為14.30、條件置位指令通用寫法:SETcc reg8/mem8作用:若條件cc成立,則dest=1,否則,dest=0 ;SETcc有很多種命令形式,這里的cc只是一個(gè)描述符,具體的參見下面的三個(gè) 表,其中,E( Equal)表示相等,G( Greatet)表示帶符號(hào)大于,L( Less) 表示帶符號(hào)小于,A( Above)表示無(wú)符號(hào)大于,B( Below)表示無(wú)符號(hào)小于。表一:測(cè)試單個(gè)標(biāo)志位的SETcc指令:SETcc指令描述置1條件SETC,SETB,SETNAE有

32、進(jìn)位時(shí)置1CF=1SETNC,SETNB,SETAE無(wú)進(jìn)位時(shí)置1CF=0SETZ,SETE為0(相等)時(shí)置1ZF=1SETNA,SETNE非0(不等)時(shí)置1ZF=0SETS為負(fù)時(shí)置1SF=1SETNS為正時(shí)置1SF=0SET0溢出時(shí)置1OF=1SETNO不溢出時(shí)置1OF=0SETP,SETPE1的個(gè)數(shù)為偶數(shù)時(shí)置1PF=1SETNP,SETPO1的個(gè)數(shù)為奇數(shù)時(shí)置1PF=0表二:用于帶符號(hào)數(shù)比較的SETcc指令,這些指令常用在CMP指令之后,以 判斷帶符號(hào)數(shù)的大小:SETcc指令描述置1條件SETG,SETNLE大于(不小于等于)時(shí)置1SF=OF 且 ZF=0SETGE,SETNL大于等于(不小于

33、)時(shí)置1SF=OFSETL,SETNGE小于(不大于等于)時(shí)置1SF/OFSETLE,SETNG小于等于(不大于)時(shí)置1SF/OF 或 ZF=1表三:用于無(wú)符號(hào)數(shù)比較的SETcc指令,常用在CMP指令之后,用來(lái)判斷無(wú) 符號(hào)數(shù)的大小:SETcc指令描述置1條件SETA,SETNBE大于(不小于等于)時(shí)置1CF=0 且 ZF=0SETAE,SETNB,SETNC大于等于(不小于)時(shí)置1CF=0SETB,SETNAE,SETC小于(不大于等于)時(shí)置1CF=1SETBE,SETNA小于等于(不大于)時(shí)置1CF=1或ZF=1位操作指令結(jié)束控制轉(zhuǎn)移指令開始 31、JMP(無(wú)條件轉(zhuǎn)移指令) 執(zhí)行代碼的跳轉(zhuǎn),

34、分為兩種,一:段內(nèi)轉(zhuǎn)移,即要跳過去的代碼地址和當(dāng)前地 址在同一段,這時(shí)只要修改IP (專用寄存器-指令指針)即可;二:段間轉(zhuǎn)移: 即要跳過去的代碼地址和當(dāng)前代碼地址不在同一段內(nèi),需要同時(shí)修改CS和IP 的值。寫法:1、JMP label;若 label與該指令位于同一代碼段內(nèi),IP=label的偏移地址,否 則CS:IP=label的分段地址,簡(jiǎn)單的說,就是跳到label的地址去。2、JMP reg16/mem16 ;段內(nèi)轉(zhuǎn)移,偏移地址=reg16/mem163、JMP mem32 ;段間間接轉(zhuǎn)移,段地址CS=mem32高字,偏移地址 IP=mem32 低字。說明:當(dāng)操作數(shù)是內(nèi)存操作數(shù)時(shí),若內(nèi)

35、存操作數(shù)是雙字類型,則產(chǎn)生段間轉(zhuǎn)移, 若內(nèi)存操作數(shù)是字類型,則產(chǎn)生段內(nèi)間接轉(zhuǎn)移。當(dāng)不能確定類型時(shí),編譯器將 報(bào)錯(cuò)。32、Jcc (條件轉(zhuǎn)移指令)寫法:Jcc label ;作用:若條件成立,則IP=label的偏移地址,否則,CPU將忽略該條件轉(zhuǎn)移, 繼續(xù)執(zhí)行下一條指令。條件轉(zhuǎn)移有以下幾種形式:表一:測(cè)試單個(gè)標(biāo)志位的Jcc指令:Jcc指令描述轉(zhuǎn)移條件JC,JB,JNAE有進(jìn)位時(shí)轉(zhuǎn)移CF=1JNC,JNB,JAE無(wú)進(jìn)位時(shí)轉(zhuǎn)移CF=0JZ,JE為零(相等)時(shí)轉(zhuǎn)移ZF=1JNZ,JNE非零(不等)時(shí)轉(zhuǎn)移ZF=0JS為負(fù)時(shí)轉(zhuǎn)移SF=1JNS為正時(shí)轉(zhuǎn)移SF=0JO溢出時(shí)轉(zhuǎn)移OF=1JON不溢出時(shí)轉(zhuǎn)移OF

36、=0JP,JPE1的個(gè)數(shù)為偶數(shù)時(shí)轉(zhuǎn)移PF=1JNP,JPO1的個(gè)數(shù)為奇數(shù)時(shí)轉(zhuǎn)移PF=0表二:用于帶符號(hào)數(shù)比較的Jcc指令(常用在CMP指令之后,以判斷帶符號(hào) 數(shù)的大小)Jcc指令描述轉(zhuǎn)移條件JG,JNLE大于(不小于等于)時(shí)轉(zhuǎn)移SF=OF 且 ZF=0JGE,JNL大于等于(不小于)時(shí)轉(zhuǎn)移SF=OF兒 LNGE小于(不大于等于)時(shí)轉(zhuǎn)移SFOFJLE,LNG小于等于(不大于)時(shí)轉(zhuǎn)移SFOF 或ZF=1表三:用于無(wú)符號(hào)數(shù)比較的Jcc指令(常用在CNO指令之后,以判斷無(wú)符號(hào) 數(shù)的大?。㎎cc指令描述轉(zhuǎn)移條件JA,JNBE大于(不小于等于)時(shí)轉(zhuǎn)移CF=0 且 ZF=0JAE,JNB,JNC大于等于(不

37、小于)時(shí)轉(zhuǎn)移CF=0JB,LNAE,JC小于(不大于等于)時(shí)轉(zhuǎn)移CF=1JBE,LNA小于等于(不大于)時(shí)轉(zhuǎn)移ZF=1或CF=133、JCXZ/JECXZ( Jump if CX/ECX is zero)寫法:JCXZ label ;(若 CX=0,則轉(zhuǎn)移到 label)JECXZ label ;(若 ECX=0,則轉(zhuǎn)移到 label)說明:label相對(duì)位移量必須在-126127之間34、循環(huán)指令LOOP label ;作用:CX=CX-1 ;若CX0,則轉(zhuǎn)移到label ;LOOPZ/LOOPE label ;作用:CX=CX-1 ;若 CX0 且 ZF=1,則轉(zhuǎn)移到 label ;LOO

38、PNZ/LOOPNE label ;作用:CX=CX-1 ;若 CX0 且 ZF=0,則轉(zhuǎn)移到 label ;說明:label相對(duì)位移量必須在-128127之間35、過程調(diào)用和返回指令CALL (過程調(diào)用)寫法:CALL label ;作用:若label與該指令在同一代碼段,則為段內(nèi)直接調(diào)用,IP進(jìn)棧,IP=label的偏移地址,如果是不在同一代碼段,則為段間間接調(diào)用,CS:IP進(jìn) 棧,CS:IP=label的分段地址 寫法:CALL reg16/mem16 ;作用:段內(nèi)間接調(diào)用,IP進(jìn)棧,IP=reg16/【mem16】寫法:CALL mem32 ;作用:段間間接調(diào)用,CS:IP進(jìn)棧,CS等

39、于mem32高字,ip等于mem32低 字。該指令與JMP指令的區(qū)別就是保存了 CS:IP的值,這樣在調(diào)用指令結(jié)束后,可 以返回回來(lái)而已。RET (過程返回)寫法:RET;近返回或遠(yuǎn)返回RETN ;近返回;RETF;遠(yuǎn)返回RET imm16 ;近返回或遠(yuǎn)返回,并調(diào)整堆棧,SP=SP+imm16 ;RETN imm16 ;近返回,并調(diào)整堆棧,SP=SP+imm16 ;RETF imm16 ;遠(yuǎn)返回,并調(diào)整堆棧,SP=SP+imm16 ;作用:RET/RETN/RETF :返回地址出棧,從而使調(diào)用返回,其中,遠(yuǎn)返回是 POP 一個(gè)雙字到CS:IP,而近返回是POP 一個(gè)字到IPRET/RETN/R

40、ETF imm16 :在返回后,CPU立即將imm16加到堆棧指針SP。 這種機(jī)制用來(lái)在返回前將參數(shù)從棧中移除。說明:CALL與RET必須配合使用,并且確保返回時(shí)棧頂正好是返回地址,不 然就會(huì)出錯(cuò)。36、IN T (中斷指令)寫法:INT n;(n為中斷號(hào),取值為0255)通常,程序內(nèi)部的跳轉(zhuǎn),用JMP或CALL,并且JMP和CALL得參數(shù)是要跳轉(zhuǎn) 的過程的入口指令地址,而INT則是調(diào)用系統(tǒng)提供的中斷服務(wù)程序,并且參數(shù) 是中斷號(hào),然后由CPU根據(jù)中斷號(hào)去計(jì)算中斷服務(wù)程序的入口地址,MS DOS 使用中斷號(hào)21H作為系統(tǒng)調(diào)用,一般INT中斷的步驟如下:(1)由AH給出中斷號(hào)(2)根據(jù)相應(yīng)功能的要

41、求,設(shè)置入口參數(shù)(3)INT21H(4)分析和使用出口參數(shù)比如如下代碼實(shí)現(xiàn)程序的退出并返回DOS :Mov ah,4ch ;給出中斷號(hào)Int 21h ;-開始中斷說明:除了直接以AL或AX返回出口參數(shù)外,INT 21H還是用AL或AX作為 返回碼,對(duì)于功能號(hào)02eh,由AL返回0(表示成功)或1(表示失?。?; 其余功能號(hào)則由CF返回0或者1,并由AX返回錯(cuò)誤碼??刂妻D(zhuǎn)移指令結(jié)束標(biāo)志處理指令開始 37、標(biāo)志處理指令CLC ; CF=0STC ; CF=1CMC ; CF=NOT CFCLD ; DF=0STD ; DF=1CLI ; IF=0(應(yīng)慎用)STI ; IF=1標(biāo)志處理指令結(jié)束串操作指

42、令開始 到這為止,所涉及的指令都是處理一個(gè)操作數(shù),如果要處理連續(xù)內(nèi)存單元的一 批數(shù)據(jù),通常需借助于循環(huán)。而串操作指令就可以用來(lái)處理內(nèi)存中的數(shù)據(jù)串, 并在助記符后面加上B、W、D分別表示操作類型為字節(jié)、字或雙字38、MOVS (串傳送)寫法:MOVSB/MOVSW/MOVSD功能:ES:DI = DS:SIIf(DF=0)ThenSI=SI+size;DI=DI+size;ElseSI=SI-size;DI=DI-size;Endif其中,size 等于 1(B)、2(W)、4(D).作用:將DS:SI所指源串的一個(gè)字節(jié)/字/雙字復(fù)制到ES:DI所指的內(nèi)存單元, 然后,若DF=0,則SI和DI增

43、加1、2、4,否則減少1、2、4.現(xiàn)在有點(diǎn)明白為什么SI為源變址寄存器,而DI為目標(biāo)變址寄存器了,而DS 為數(shù)據(jù)段寄存器,ES為附加段寄存器了。39、LODS(串載入)寫法:LODSBLODSWLODSD功能:AL/AX/EAX=DS:SI;IF (DF=0) THENSI=SI+size;ELSESI=SI-size;Endif作用:將DS:SI所指源串的值復(fù)制到AL/AX/EAX中,然后,根據(jù)DF使SI增 加或減小1、2、440、STOS(串存儲(chǔ))寫法:STOSBSTOSWSTOSD功能:ES:DI=AL/AX/EAX ;IF (DF=0) THENDI=DI+size ;ELSEDI=DI-size

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論