版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 匯編指令全集ZZ 以下是80X86匯編過(guò)程中經(jīng)常用到的一些匯編指令。從功能分類上來(lái)說(shuō),一共可分為一、 數(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。四、
2、60; 控制轉(zhuǎn)移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。五、 串操作指令:MOVS、LODS、STOS、CMPS、SCAS。六、 標(biāo)志處理指令:CLC、STC、CLD、STD。七、 32位CPU新增指令-數(shù)據(jù)傳送指令-1、 MOV(傳送)指令寫(xiě)法:MOV target,source功能描述:將源操作數(shù)source的值復(fù)制到target中去
3、,source值不變注意事項(xiàng):1)target不能是CS(代碼段寄存器),我的理解是代碼段不可寫(xiě),只可讀,所以相應(yīng)這地方也不能對(duì)CS執(zhí)行復(fù)制操作。2)target和source不能同時(shí)為存數(shù)、段寄存器(CSDSESSSFSGS)3)不能將立即數(shù)傳送給段寄存器4)target和source必須類型匹配,比如,要么都是字節(jié),要么都是字或者都是雙字等。4)由于立即數(shù)沒(méi)有明確的類型,所以將立即數(shù)傳送到target時(shí),系統(tǒng)會(huì)自動(dòng)將立即數(shù)零擴(kuò)展到與target數(shù)的位數(shù)一樣,再進(jìn)行傳送。有時(shí),需要用BYTE PTR 、WORD PTR、 DWORD PTR明確指出立即數(shù)的位數(shù)寫(xiě)法示例:M
4、OV dl,01H;MOV eax,bp; eax =ss:bp 雙字傳送。2、 XCHG(交換)指令寫(xiě)法:XCHG object1,object2功能描述:交換object1與object2的值注意事項(xiàng):1)不能直接交換兩個(gè)存數(shù)的值 2)類型必須匹配3)兩個(gè)操作數(shù)任何一個(gè)都不能是段寄存器看來(lái)段寄存器的寫(xiě)入的限制非常的嚴(yán)格,MOV指令也不能對(duì)段寄存器進(jìn)行寫(xiě)入,4)必須是通用寄存器(ax、bx、cx、dx、si、di)或存數(shù)寫(xiě)法示例:XCHG ax,bx
5、si; XCHG ax,bx;3、 LEA(裝入有效地址)指令寫(xiě)法:LEZ reg16,mem功能描述:將有效地址MEM的值裝入到16位的通用寄存器中。寫(xiě)法示例:假定bx=5678H,EAX=1,EDX=2
6、 Lea si,2bx si=567AH
7、 Lea di,2eaxedx di=5注意,這里裝入的是有效地址,并不是實(shí)際的存中的數(shù)值,如果要想取存中該地址對(duì)應(yīng)的數(shù)值,還需要加上段地址才行,而段地址有可能保存在DS中,也有可能保存在SS或者CS中哦:>不知道我的理解可正確。4、 LDSLESLGSLSS(注意,與LEA不同的是,這里是裝入的值,而不是有效地址)這幾個(gè)指令,名稱不同,作用差不多。寫(xiě)法:LDS reg16,mem32
8、0; 功能描述: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位通用寄存器 在接著往下說(shuō)之前,先熟悉下堆棧的概念。堆棧,位于存的堆棧段中,是存的一部分,具有“先進(jìn)后出”的特點(diǎn),堆棧只有一個(gè)入口,即當(dāng)前棧頂,當(dāng)堆棧為空時(shí),棧頂和棧底指向同一存地址,在WINDOWS中,可以把堆棧理解成一個(gè)倒著的啤酒瓶,上面的地址大,下面的地址小,當(dāng)從瓶口往啤酒瓶塞啤酒時(shí)(進(jìn)棧),棧頂就會(huì)往瓶口下移動(dòng),也就是往低地址方向移動(dòng),同理,出棧時(shí),正好相反,
9、把啤酒給倒出來(lái),棧頂向高地址方向移動(dòng)。這就是所謂的堆棧 ,哼哼,很Easy吧。在匯編語(yǔ)言中,堆棧操作的最小單位是字,也就是說(shuō),只能以字或雙字為單位,同時(shí),SS:SP指向棧頂(SS為堆棧段寄存器,SP為堆棧指針,二者一相加,就構(gòu)成了堆棧棧頂?shù)拇娴刂罚?、 PUSH(進(jìn)棧)寫(xiě)法:PUSH reg16(32)/seg/mem16(32)/imm功能描述:將通用寄存器/段寄存器/存數(shù)/立即數(shù)的值壓入棧中,即:SP=SP-2 SS:SP=16位數(shù)值(當(dāng)將32位數(shù)值壓入棧中時(shí),SP=SP-4,SS:SP=32為數(shù)值)6、
10、160; POP(出棧)寫(xiě)法:POP reg16(32)/seg/mem16(32)不能出棧到CS中功能描述:將堆??诘?6(32)位數(shù)據(jù)推出到通用寄存器/段寄存器/存中,即:寄存器/段寄存器/存= 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依
11、次進(jìn)棧。POPA出棧順序正好相反,但要注意的是,彈出到SP的值被丟棄,SP通過(guò)增加16位來(lái)恢復(fù)(當(dāng)然嘛,不然棧頂?shù)刂肪捅恍薷牧?,就?huì)出息不對(duì)齊的情況,就有可能亂套了)POPAD PUSHAD一樣,只不過(guò)是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ù)寄存器的值,如下:交換a
12、x與cx的值:push ax;push cx;pop ax; pop cx;保護(hù)寄存器:push ax;push cx;.中間有很多執(zhí)行的代碼pop cx;pop ax;9、LAHFSAHF(標(biāo)志寄存器傳送指令)寫(xiě)法:lahf;作用:AH=FLAGS的低8位寫(xiě)法: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ò)展指令的一般形式)寫(xiě)法:MOVSX reg1632,reg8reg16mem8mem16作用:用來(lái)
13、將8位符號(hào)擴(kuò)展到16位,或者16位符號(hào)擴(kuò)展到32位MOVZX(零擴(kuò)展指令)寫(xiě)法:MOVZX reg1632,reg8reg16mem8mem16零擴(kuò)展,就是高位補(bǔ)0進(jìn)行擴(kuò)展。通常用在將數(shù)據(jù)復(fù)制到一個(gè)不同的寄存器中,如AL零擴(kuò)展為EBX。一樣寄存器的零擴(kuò)展,可以使用MOV 高位, 0來(lái)實(shí)現(xiàn)。11、BSWAP(字節(jié)交換)寫(xiě)法:bswap reg32作用:將reg32的第0與第3個(gè)字節(jié),第1與第2個(gè)字節(jié)進(jìn)行交換。示例:設(shè)EAX=12345678h執(zhí)行bswap eax;后,eax=78563412H12、XLAT(換碼)寫(xiě)法:XLAT;作用:AL=DS:bx+AL將DS:BX所指存中的由AL指定位移
14、處的一個(gè)字節(jié)賦值給AL。(貌似這是一個(gè)方便偷懶的指令哦。),原來(lái)它的主要用途是查表。注意可以給它提供操作數(shù),用來(lái)指定使用哪個(gè)段地址,如:XLAT ES:table;使用ES來(lái)作為段地址,table不起作用。XLAT table ;使用table所在段對(duì)應(yīng)的段寄存器作為段地址。-數(shù)據(jù)傳送指令結(jié)束- -算術(shù)指令開(kāi)始-13、ADD(加法)寫(xiě)法:ADD reg/mem reg/mem/imm作用:將后面的操作數(shù)加到前面的操作數(shù)中注意:兩個(gè)操作數(shù)必須類型匹配,并且不能同時(shí)是存操作數(shù)ADC (帶進(jìn)位加法)寫(xiě)法:ADC reg/mem, reg/mem/imm ;作用:dest=dest+src+
15、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(自加一)寫(xiě)法:INC reg/mem;作用:dest=dest+1;15、XADD(交換加)寫(xiě)法:XADD reg/mem, reg作用:先將兩個(gè)數(shù)交換,然將二者之和送給第一個(gè)數(shù)16、SUB(減法)寫(xiě)法:SUB reg/mem, reg/mem/imm;作用:dest=dest-src;SBB(帶借位減法)寫(xiě)法:SBB reg/mem, reg/mem/imm作用:dest=dest-src-cf;注意:兩個(gè)操作數(shù)必須類型匹配,且
16、不能同時(shí)是存數(shù)17、DEC(自減1)寫(xiě)法:DEC reg/mem;作用:dest=dest-1;18、CMP(比較)寫(xiě)法:CMP reg/mem, reg/mem/imm作用:dest-src注意:這里并不將結(jié)果存入dest中,而僅僅是執(zhí)行相減的運(yùn)算,達(dá)到依據(jù)運(yùn)算結(jié)果去影響EFLAG標(biāo)志位的效果19、NEG(求補(bǔ))寫(xiě)法:NEG reg/mem作用:求補(bǔ)就是求相反數(shù),即:dest=0-dest;20、CMPXCHG(比較交換)寫(xiě)法:CMPXCHG reg/mem, reg;作用:AL/AX/EAX-oprd1,如果等于0,則oprd1=oprd2,否則,AL/AX/EAX=oprd1;即:比較A
17、L/AX/EAX與第一個(gè)操作數(shù),如果相等,則置ZF=1,并復(fù)制第二個(gè)操作數(shù)給第一個(gè)操作數(shù);否則,置ZF=0,并復(fù)制第一個(gè)操作數(shù)給AL/AX/EAX。說(shuō)明:CMPXCHG主要為實(shí)現(xiàn)原子操作提供支持CMPXCHG8B(8字節(jié)比較交換指令)寫(xiě)法:CMPXCHG8B MEM64;功能:將EDX:EAX中的64位數(shù)與存的64位數(shù)進(jìn)行比較,如果相等,則置ZF=1,并存儲(chǔ)ECX:EBX到mem64指定的存地址;否則,置ZF=0,并設(shè)置EDX:EAX為mem64的8字節(jié)容21、MUL(無(wú)符號(hào)乘法)寫(xiě)法:MUL reg/mem;作用:當(dāng)操作數(shù)為8位時(shí),AX=AL*src;當(dāng)操作數(shù)為16位時(shí),DX:AX=AX*s
18、rc;當(dāng)操作數(shù)為32位時(shí),EDX:EAX=EAX*src;22、IMUL(帶符號(hào)位乘法)寫(xiě)法:IMUL reg/mem;(作用同上)IMUL reg16,reg16/mem16,imm16;IMUL reg32,reg32/mem32,imm32;IMUL reg16,imm16/reg16/imm16;IMUL reg32,reg32/mem32/imm32;注意:沒(méi)有兩個(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=0
19、FFFFH(-1)(高一半為低一半的擴(kuò)展)23、DIV(無(wú)符號(hào)除法 )/IDIV(帶符號(hào)數(shù)除法)寫(xiě)法:DIV reg/mem;/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;在下列
20、情況下,會(huì)使CPU產(chǎn)生中斷:一:除數(shù)為0 ;二:由于商太大,導(dǎo)致EAXAX或AL不能容納,從而產(chǎn)生了溢出。-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)整)寫(xiě)法:DAA;作用:調(diào)整AL中的和
21、為壓縮BCD碼。功能:使用DAA指令時(shí),通常先執(zhí)行ADD/ADC指令,將兩個(gè)壓縮BCD碼相加,結(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說(shuō)明: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低
22、4位>9 或 AF=1)THENAL=AL-6;AF=1;ENDIFIF( AL高4位>9或CF=1)THENAL=AL-60H;CF=1;ENDIF說(shuō)明: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)志位就是專門(mén)為BCD碼調(diào)整設(shè)計(jì)的,當(dāng)?shù)退奈挥邢蚋咚奈贿M(jìn)位或借位時(shí),值為1。而CF就是最高位有進(jìn)位或者借位時(shí),為1.非壓縮BCD碼調(diào)整指令,包括AAA,AAS,AAM,AAD。寫(xiě)法:AAA ;作用:調(diào)整AL中的和為非壓縮BC
23、D碼;調(diào)整后,AL高4位等于0,AH=AH+產(chǎn)生的CF功能:使用AAA指令時(shí),通常先執(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寫(xiě)法:AAS ;作用:調(diào)整AL中的差為非壓縮BCD碼;調(diào)整后,AL高4位等于0,AH=AH-產(chǎn)生的CF功能:使用AAS指令時(shí),通常先執(zhí)行
24、SUB/SBB指令,以AL為目的操作數(shù),將兩個(gè)非壓縮BCD碼(與高位無(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寫(xiě)法:AAM;作用:AH=AX DIV 10, AL=AX MOD 10;功能:使用AAM時(shí),通常先執(zhí)行MUL/IMUL指令,將兩個(gè)一字節(jié)非壓縮BCD碼(高四位必須為0)相乘,結(jié)果存入AX.然后使用AAM指令將AX(AH=
25、0)調(diào)整為兩字節(jié)壓縮BUC碼格式。寫(xiě)法:AAD;作用: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é)束-位操作指令開(kāi)始-25、ANDORXORNOTTEST寫(xiě)法:AND reg/mem,reg/mem/imm;OR reg/mem,reg/mem/imm;XOR reg/mem,reg/mem/imm;
26、NOT reg/mem;TEST reg/mem,reg/mem/imm;作用:ANDTESTORXOR,兩個(gè)操作數(shù)必須類型匹配,而且不能同時(shí)是存操作數(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(邏輯左移)寫(xiě)法:SHL REGmem,1CL ;作用:將dest的各個(gè)二進(jìn)制位向左移動(dòng)1(CL)位,并將DEST的最高位移出到CF,最低位移入0。SAL(算術(shù)左移)寫(xiě)法:SAL REGmem,
27、1CL ;作用:將dest的各個(gè)二進(jìn)制位向左移動(dòng)1(CL)位,并將DEST的最高位移出到CF,最低位移入0(同SHL)。SHR(邏輯右移)寫(xiě)法:SHR REGmem,1CL ;作用:將dest的各個(gè)二進(jìn)制位向左移動(dòng)1(CL)位,并將DEST的最低位移出到CF,最高位移入0。SAR(算術(shù)右移)寫(xiě)法:SAR REGmem,1CL ;作用:將dest的各個(gè)二進(jìn)制位向左移動(dòng)1(CL)位,并將DEST的最低位移出到CF,最高位不變。SHLD(雙精度左移)寫(xiě)法:SHLD REG16/REG32/MEM16/MEM32, REG16/REG32, IMM8/CL;(類型須匹配)作用:將OPRD1的各二進(jìn)制左
28、移,并將oprd1的最高位移到CF,oprd2的最高位移到oprd1的最低位,但是,oprd2的值不變。SHRD(雙精度右移)寫(xiě)法與作用與雙精度左移類似。注意移動(dòng)方向?yàn)橛乙?。以上位移指令?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)左移)寫(xiě)法:ROL REGMEM, 1CL;或 ROL REG/MEM,IMM8;(類型可不匹配)作用:將DEST的各二進(jìn)制位向左移動(dòng),并將最高位移出到CF,并同時(shí)移入最低位。ROR(循環(huán)右移)寫(xiě)法:R
29、OR REGMEM, 1CL;或 ROR REG/MEM,IMM8;(類型可不匹配)作用:將DEST的各二進(jìn)制位向右移動(dòng),并將最低位移出到CF,并同時(shí)移入最高位。RCL(帶進(jìn)位循環(huán)左移)寫(xiě)法:RCL REGMEM, 1CL;或 RCL REG/MEM,IMM8;(類型可不匹配)作用:將DEST的各二進(jìn)制位向左移動(dòng),并將最高位移出到CF,原CF移入最低位。RCR(帶進(jìn)位循環(huán)右移)寫(xiě)法:RCR REGMEM, 1CL;或 RCR REG/MEM,IMM8;(類型可不匹配)作用:將DEST的各二進(jìn)制位向右移動(dòng),并將最低位移出到CF,原CF移入最高位。28、位測(cè)試指令BT(位測(cè)試)寫(xiě)法:BT REG1
30、6/MEM16,REG16/IMM8;或BT REG32/MEM32,REG32/IMM8;作用:CF=DEST的第index位,dest不變。BTS(位測(cè)試并置位)寫(xiě)法:BTS REG16/MEM16,REG16/IMM8;或BTS REG32/MEM32,REG32/IMM8;作用:CF=DEST的第index位,dest的第index位=1;BTR(位測(cè)試并復(fù)位)寫(xiě)法:BTR REG16/MEM16,REG16/IMM8;或BTR REG32/MEM32,REG32/IMM8;作用:CF=DEST的第index位,dest的第index位=0;BTC(位測(cè)試并復(fù)位)寫(xiě)法:BTC REG1
31、6/MEM16,REG16/IMM8;或BTC REG32/MEM32,REG32/IMM8;作用:CF=DEST的第index位,dest的第index位取反;說(shuō)明:若dest為寄存器,則以index除以16(dest為reg16)或32(dest為reg32)的余數(shù)作為測(cè)試位。當(dāng)然,index最好不要超出操作數(shù)的位數(shù)。若dest為存操作數(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指令可用于并發(fā)程序設(shè)計(jì)。29、位掃描指令BSF(前向位掃描)寫(xiě)
32、法:BSF reg16/reg32, reg16/reg32/mem16/mem32;(類型須匹配)作用:dest=src中值為1的最低位編號(hào)(從低位向高位搜索)BSR(后向位掃描)寫(xiě)法:BSR reg16/reg32, reg16/reg32/mem16/mem32;(類型須匹配)作用:dest=src中值為1的最高位編號(hào)(從高位向低位搜索)說(shuō)明:BSF和BSR搜索SRC操作數(shù)中首次出現(xiàn)1的位置,BSF從低位向高位搜索,BSR反之。若找到一個(gè)1,則置ZF=0,并存儲(chǔ)位編號(hào)到DEST操作數(shù)中。若SRC=0,即沒(méi)有1出現(xiàn),則置ZF=1,且dest的值不確定。比如,有如下二進(jìn)制數(shù)0111 1111
33、 1010 0100執(zhí)行bsf后,位編號(hào)為2,執(zhí)行bsr后,位編號(hào)為14.30、條件置位指令通用寫(xiě)法:SETcc reg8/mem8作用:若條件cc成立,則dest=1,否則,dest=0;SETcc有很多種命令形式,這里的cc只是一個(gè)描述符,具體的參見(jiàn)下面的三個(gè)表,其中,E(Equal)表示相等,G(Greater)表示帶符號(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有進(jìn)位時(shí)置1CF=1SETNC,SETNB,SETAE無(wú)進(jìn)位時(shí)置1CF=0
34、SETZ,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ù)的大?。篠ETcc指令描述置1條件SETG,SETNLE大于(不小于等于)時(shí)置1SF=OF且ZF=0SETGE,SETNL大于等于(不小于)時(shí)置1SF=OFSETL,SETNGE小于(不大于等于)時(shí)置1SFOFSET
35、LE,SETNG小于等于(不大于)時(shí)置1SFOF或ZF=1表三:用于無(wú)符號(hào)數(shù)比較的SETcc指令,常用在CMP指令之后,用來(lái)判斷無(wú)符號(hào)數(shù)的大?。篠ETcc指令描述置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)移指令開(kāi)始-31、JMP(無(wú)條件轉(zhuǎn)移指令)執(zhí)行代碼的跳轉(zhuǎn),分為兩種,一:段轉(zhuǎn)移,即要跳過(guò)去的代碼地址和當(dāng)前地址在同一段,這時(shí)只要修改IP(專用寄存器
36、-指令指針)即可;二:段間轉(zhuǎn)移:即要跳過(guò)去的代碼地址和當(dāng)前代碼地址不在同一段,需要同時(shí)修改CS和IP的值。寫(xiě)法:1、JMP label;若label與該指令位于同一代碼段,IP=label的偏移地址,否則CS:IP=label的分段地址,簡(jiǎn)單的說(shuō),就是跳到label的地址去。2、JMP reg16/mem16;段轉(zhuǎn)移,偏移地址=reg16/mem163、JMP mem32;段間間接轉(zhuǎn)移,段地址CS=mem32高字,偏移地址IP=mem32低字。說(shuō)明:當(dāng)操作數(shù)是存操作數(shù)時(shí),若存操作數(shù)是雙字類型,則產(chǎn)生段間轉(zhuǎn)移,若存操作數(shù)是字類型,則產(chǎn)生段間接轉(zhuǎn)移。當(dāng)不能確定類型時(shí),編譯器將報(bào)錯(cuò)。32、Jcc(條
37、件轉(zhuǎn)移指令)寫(xiě)法:Jcc label;作用:若條件成立,則IP=label的偏移地址,否則,CPU將忽略該條件轉(zhuǎn)移,繼續(xù)執(zhí)行下一條指令。條件轉(zhuǎn)移有以下幾種形式:表一:測(cè)試單個(gè)標(biāo)志位的Jcc指令:Jcc指令描述轉(zhuǎn)移條件JC,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=0JP,JPE1的個(gè)數(shù)為偶數(shù)時(shí)轉(zhuǎn)移PF=1JNP,JPO1的個(gè)數(shù)為奇數(shù)時(shí)轉(zhuǎn)移PF=0表二:用于帶符號(hào)數(shù)比較的Jcc指令(常用在CMP指令之后
38、,以判斷帶符號(hào)數(shù)的大?。㎎cc指令描述轉(zhuǎn)移條件JG,JNLE大于(不小于等于)時(shí)轉(zhuǎn)移SF=OF且ZF=0JGE,JNL大于等于(不小于)時(shí)轉(zhuǎn)移SF=OFJL,LNGE小于(不大于等于)時(shí)轉(zhuǎn)移SF<>OFJLE,LNG小于等于(不大于)時(shí)轉(zhuǎn)移SF<>OF或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大于等于(不小于)時(shí)轉(zhuǎn)移CF=0,LNAE,JC小于(不大于等于)時(shí)轉(zhuǎn)移CF=1E,LNA小于等于(不大于)時(shí)轉(zhuǎn)移ZF=1或CF=13
39、3、JCXZ/JECXZ(Jump if CX/ECX is zero)寫(xiě)法:JCXZ label;(若CX=0,則轉(zhuǎn)移到label)JECXZ label;(若ECX=0,則轉(zhuǎn)移到label)說(shuō)明:label相對(duì)位移量必須在-126127之間 34、循環(huán)指令LOOP label;作用:CX=CX-1;若CX<>0,則轉(zhuǎn)移到label;LOOPZ/LOOPE label;作用:CX=CX-1;若CX<>0且 ZF=1,則轉(zhuǎn)移到label;LOOPNZ/LOOPNE label;作用:CX=CX-1;若CX<>0且ZF=0,則轉(zhuǎn)移到label;說(shuō)明:
40、label相對(duì)位移量必須在-128127之間35、過(guò)程調(diào)用和返回指令CALL(過(guò)程調(diào)用)寫(xiě)法:CALL label;作用:若label與該指令在同一代碼段,則為段直接調(diào)用,IP進(jìn)棧,IP=label的偏移地址,如果是不在同一代碼段,則為段間間接調(diào)用,CS:IP進(jìn)棧,CS:IP=label的分段地址寫(xiě)法:CALL reg16/mem16;作用:段間接調(diào)用,IP進(jìn)棧,IP=reg16/mem16寫(xiě)法:CALL mem32;作用:段間間接調(diào)用,CS:IP進(jìn)棧,CS等于mem32高字,ip等于mem32低字。該指令與JMP指令的區(qū)別就是保存了CS:IP的值,這樣在調(diào)用指令結(jié)束后,可以返回回來(lái)而已。RE
41、T(過(guò)程返回)寫(xiě)法: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/RETF imm16:在返回后,CPU立即將imm16加到堆棧指針SP。這種機(jī)制用來(lái)在返回前將參數(shù)從棧中移除。說(shuō)明:CALL 與 RET必須配合使用,并且確保返
42、回時(shí)棧頂正好是返回地址,不然就會(huì)出錯(cuò)。36、IN T(中斷指令)寫(xiě)法:INT n;(n為中斷號(hào),取值為0255)通常,程序部的跳轉(zhuǎn),用JMP或CALL,并且JMP和CALL得參數(shù)是要跳轉(zhuǎn)的過(guò)程的入口指令地址,而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)功能的要求,設(shè)置入口參數(shù)(3)INT 21H(4)分析和使用出口參數(shù)比如如下代碼實(shí)現(xiàn)程序的退出并返回DOS:Mov ah,4ch;-給出中斷號(hào)Int 21h; -開(kāi)始中斷說(shuō)明:除
43、了直接以AL或AX返回出口參數(shù)外,INT 21H還是用AL或AX作為返回碼,對(duì)于功能號(hào)02eh,由AL返回0(表示成功)或1(表示失敗);其余功能號(hào)則由CF返回0或者1,并由AX返回錯(cuò)誤碼。-控制轉(zhuǎn)移指令結(jié)束-標(biāo)志處理指令開(kāi)始-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é)束-串操作指令開(kāi)始-到這為止,所涉與的指令都是處理一個(gè)操作數(shù),如果要處理連續(xù)存單元的一批數(shù)據(jù),通常需借助于循環(huán)。而串操作指令就可以用來(lái)處理存中的數(shù)據(jù)串,并在助記符后面加上B、W、
44、D分別表示操作類型為字節(jié)、字或雙字38、MOVS(串傳送)寫(xiě)法: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所指的存單元,然后,若DF=0,則SI和DI增加1、2、4,否則減少1、2、4.現(xiàn)在有點(diǎn)明白為什么SI為源變址寄存器,而DI為目標(biāo)變址寄存器了,而DS為數(shù)據(jù)段寄存器,ES為附加段寄存器了。 39、LODS(串載入)寫(xiě)法:LODS
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024農(nóng)村荒山租賃合同
- 2024山林租賃合同范文
- 2024建設(shè)工程勘察合同范本怎樣寫(xiě)
- 2024訂貨購(gòu)銷合同范本范文
- 2024的廣播電視服務(wù)合同
- 2024正式的產(chǎn)品代理合同樣書(shū)
- 深圳大學(xué)《油畫(huà)基礎(chǔ)》2022-2023學(xué)年第一學(xué)期期末試卷
- 阿姨照顧小孩合同(2篇)
- 魚(yú)池合同范本(2篇)
- 初一下學(xué)期新學(xué)期計(jì)劃范文(7篇)
- 秋日私語(yǔ)(完整精確版)克萊德曼(原版)鋼琴雙手簡(jiǎn)譜 鋼琴譜
- 辦公室室內(nèi)裝修工程技術(shù)規(guī)范
- 鹽酸安全知識(shí)培訓(xùn)
- 萬(wàn)盛關(guān)于成立醫(yī)療設(shè)備公司組建方案(參考模板)
- 消防安全巡查記錄臺(tái)帳(共2頁(yè))
- 科技特派員工作調(diào)研報(bào)告
- 中波廣播發(fā)送系統(tǒng)概述
- 縣疾控中心中層干部競(jìng)聘上崗實(shí)施方案
- 急性心肌梗死精美PPt完整版
- 畢業(yè)設(shè)計(jì)(論文)基于三菱PLC的交通燈模擬控制
- 物業(yè)日常巡查記錄表.doc
評(píng)論
0/150
提交評(píng)論