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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、學習匯編語言,最關鍵的就在于匯編指令集的掌握以及計算機工作方式的理解, 以下是80X86匯編過程中經常用到的一些匯編指令。從功能分類上來說,一共可分為一、數(shù)據(jù)傳送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。二、算術指令: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。四、控制轉移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOP

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

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

4、位數(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?的值注意事項:1 )不能直接交換兩個內存數(shù)的值2 )類型必須匹配3 )兩個操作數(shù) 任何一個都不能是段寄存器【看來段寄存器的寫入的限制非常的嚴格,MOV指 令也不能對段寄存器進行寫入】,4)必須是通用寄存器(ax、bx、cx、dx、si、 di)或內存數(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ù)值,如果要想取內存 中該地址對應的數(shù)值,還需要加上段地址才行,而段地址有可能保存在DS中, 也有可能保存在SS或者CS中哦:不知道我的理解可正確。4、LDSLESLGSLSS (注意,與LEA不同的是,這里是裝入的值,而不是有 交攵地址)這幾個指令,名稱不同,作用差不多

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

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

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

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

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

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

12、ES來作為段地址,table不起作用。XLAT table ;使用table所在段對應的段寄存器作為段地址。數(shù)據(jù)傳送指令結束算術指令開始13、ADD (加法)寫法:ADD reg/mem reg/mem/imm作用:將后面的操作數(shù)加到前面的操作數(shù)中注意:兩個操作數(shù)必須類型匹配,并且不能同時是內存操作數(shù)ADC (帶進位加法)寫法:ADC reg/mem, reg/mem/imm ;作用:dest二dest+src+cf當CF=0時ADD與ADC的作用是相同的。示例:實現(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作用:先將兩個數(shù)交換,然將二者之和送給第一個數(shù)16、SUB(減法)寫法:SUB reg/mem,reg/mem/imm ;作用:dest二dest-src ;SBB (帶借位減法)寫法:SBB reg/mem,reg/mem/imm作用:dest二dest-src-cf ;注意:兩個操作數(shù)必須類型匹配,且不能同時是內存數(shù)17、DEC(自減 1)寫法:DEC reg/mem ;作用:dest二dest-1 ;18、CMP(比較)寫法:CMP reg/mem,reg/mem/imm

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

15、:CMPXCHG主要為實現(xiàn)原子操作提供支持CMPXCHG8B( 8字節(jié)比較交換指令)寫法:CMPXCHG8B MEM64;功能:將EDX:EAX中的64位數(shù)與內存的64位數(shù)進行比較,如果相等,則置ZF=1,并存儲ECX:EBX到mem64指定的內存地址;否則,置ZF=0,并設置EDX:EAX為mem64的8字節(jié)內容21、MUL(無符號乘法)寫法:MUL reg/mem ;作用:當操作數(shù)為8位時,AX=AL*src ;當操作數(shù)為16位時,DX:AX=AX*src ;當操作數(shù)為32位時,EDX:EAX=EAX*src ;22、IMUL(帶符號位乘法)寫法: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 ;注意:沒有兩個操作數(shù)均為8位的多操作數(shù)乘法。對于同一個二進制數(shù),采用MUL和IMUL執(zhí)行的結果可能不同,設 AL=0FF,BL=1,分別執(zhí)行下面的指令,會得到不同的結果: Mul bl ; AX=0FFH(255);Imul bl ; AX=0FFFFH(-1)(高一半為低一半的擴展)23、DIV(無符號除法)/IDIV(帶符號數(shù)除法)寫法:DIV reg/m

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

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

19、碼相 加,結果存放在AL中,然后使用該指令將AL調整為壓縮BCD碼格式。DAA的調整算法: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碼相加的進位。DAS;作用:調整AL中的差為壓縮BCD碼。功能:使用DAS指令時,通常先執(zhí)行SUB/SBB指令,將兩個壓縮BCD碼相 減,結果存放在AL中,然后使用該指令將AL調整為壓縮BCD碼格式。DAS的調整算法: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指令,則參加加法或減法運算的操作數(shù)應該 是壓縮BCD碼,如果將任意兩個二進制數(shù)相加或相減,然后調整,則得不到正 確的結果。關鍵是調整的規(guī)則,其中AF標志位就是專門為BCD碼調整設計的,當?shù)退奈?有向高四位進位或借位時,值為1。而CF就是最高位有進位或者借位時,為1. 非壓縮BCD碼調整指令,包括AAA,AAS,AAM,AAD。寫法:AAA ;作用:調整AL中的和為非壓縮BCD碼;調整后,AL高4位等于0 ,AH=AH+產生的CF功能:使用AAA指令時

21、,通常先執(zhí)行ADD/ADC指令,以AL為目的操作數(shù), 將兩個非壓縮BCD碼(與高位無關)相加,然后使用AAA將AL調整為非壓 縮BCD碼格式,且高4位等于0,同時,將調整產生的進位加到AH中。AAA調整算法: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 ;作用:調整AL中的差為非壓縮BCD碼;調整后,AL高4位等于0,AH=AH-產生的CF功能:使用AAS指令時,通常先執(zhí)行SUB/SBB指令,以AL為目的操作數(shù), 將兩個非壓縮BCD碼(

22、與高位無關)相減,然后使用AAS將AL調整為非壓 縮BCD碼格式,且高4位等于0,同時,將調整產生的借位從AH中減去。 AAA調整算法: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時,通常先執(zhí)行MUL/IMUL指令,將兩個一字節(jié)非壓縮 BCD碼(高四位必須為0)相乘,結果存入AX.然后使用AAM指令將AX (AH=0)調整為兩字節(jié)壓縮BUC碼格式。寫法:AA

23、D;作用:AL=AH*10+AL,AH=0;功能:使用AAD時,通常先執(zhí)行該指令,將AX中的兩字節(jié)非壓縮BCD碼 (AH與AL的高4位必須為0)調整為相應的二進制表示,然后使用 DIV/IDIV指令,除以一個一字節(jié)的非壓縮BCD碼(高四位必須為0),可得 到非壓縮BCD碼的除法結果。特別注意,參加非壓縮BCD碼乘法或除法的操作數(shù)高4位必須為0。算術指令結束位操作指令開始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,兩個操作數(shù)必須類型匹配,而且不能同 時是內存操作數(shù)。XOR通常用來將寄存器清0,如XOR AX,AX;TEST與AND的關系類似于CMP與SUB。TEST的典型用法是檢查 某位是否為1,如:TEST DX,109H ;若DX的第0,3,8位至少有一位為1,則ZF=0,否則ZF=1 ;26、移位指令SHL(邏輯左移)寫法:SHL REGmem , 1CL ;作用:將dest的各個二進制位向左移動1 (CL)位,并將DEST的最 高位移出到CF,最低位移入0。SAL (算術左移)寫法:SAL REGmem,1CL ;作用:將dest的各

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

42、令開始 到這為止,所涉及的指令都是處理一個操作數(shù),如果要處理連續(xù)內存單元的一 批數(shù)據(jù),通常需借助于循環(huán)。而串操作指令就可以用來處理內存中的數(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所指源串的一個字節(jié)/字/雙字復制到ES:DI所指的內存單元, 然后,若DF=0,則SI和DI增

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

溫馨提示

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

評論

0/150

提交評論