複習下下彙編

複習下下彙編 彙編 2009-05-06 23:48 閱讀143 評論3 字號: 大大 中中 小小 彙編(241897582) 22:12:08 數據類型 ************************************************************************************************** 十進制 二進制 十六進制 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F 16 1,0000 10 D B H 十進制的2 2D 二進制的2 0010B 十六進制2 2H ************************************************************************************************** 寄存器 ************************************************************************************************** 1. 通用寄存器  通用寄存器包括了8個16/32位的寄存器:AX/EAX、BX/EBX、CX/ECX、DX/EDX、SP/ESP、BP/EBP、DI/EDI及SI/ESI。其中AX/EAX、BX/EBX、CX/ECX、DX/EDX在一般情況下作爲通用的數據寄存器,用來暫時存放計算過程中所用到的操作數、結果或其他信息。它們還可分爲兩個獨立的8位寄存器使用,命名爲AL、AH、BL、BH、CL、CH、DL和DH。這4個通用數據寄存器除通用功能外,還有如下專門用途:   AX/EAX作爲累加器用,所以它是算術運算的主要寄存器。在乘除指令中指定用來存放操作數。另外,所有的I/O指令都使用AX或AL與外部設備傳送信息。   BX/EBX在計算存儲器地址時,可作爲基址寄存器使用。   CX/ECX常用來保存計數值,如在移位指令、循環指令和串處理指令中用作隱含的計數器。DX在作雙字長運算時,可把DX和AX組合在一起存放一個雙字長數,DX用來存放高16位數據。此外,對某些I/O操作,DX可用來存放I/O的端口地址。   SP/ESP、BP/EBP、SI/ESI、DI/EDI四個16/32位寄存器可以象數據寄存器一樣在運算過程中存放操作數,但它們只能以字(16/32位)爲單位使用。此外,它們更經常的用途是在存儲器尋址時,提供偏移地址。因此,它們可稱爲指針或變址寄存器。   SP/ESP稱爲堆棧指針寄存器,用來指出棧頂的偏移地址。   BP/EBP稱爲基址指針寄存器,在尋址時作爲基地址寄存器使用,但它必須與堆棧段寄存器SS聯用來確定堆棧段中的存儲單元地址。 2、標誌寄存器FLAG 條件碼標誌用來記錄程序中運行結果的狀態信息,它們是根據有關指令的運行結果由(CPU)自動設置的。由於這些狀態信息往往作爲後續條件轉移指令的轉移控制條件,所以稱爲條件碼。  ① 進位標誌 CF,記錄運算時最高有效位產生的進位值。  ② 符號標誌 SF,記錄運算結果的符號。結果爲負時置1,否則置0。  ③ 零標誌  ZF,運算結果爲0時ZF位置1,否則置0。  ④ 溢出標誌 OF,在運算過程中,如操作數超出了機器可表示數的範圍稱爲溢出。溢出時OF位置1,否則置0。  ⑤ 輔助進位標誌 AF,記錄運算時第3位(半個字節)產生的進位值。  ⑥ 奇偶標誌 PF,用來爲機器中傳送信息時可能產生的代碼出錯情況提供檢驗條件。當結果操作數中1的個數爲偶數時置1,否則置0。 彙編(241897582) 22:30:29 數據傳送指令 ************************************************************************************************** 1、傳送指令MOV(move) ************************************************************************************************** 傳送指令是使用最頻繁的指令,它相對於高級語言裏的賦值語句。指令的格式如下: MOV Reg/Mem, Reg/Mem/Imm 其中:Reg—Register(寄存器),Mem—Memory(存儲器),Imm—Immediate(立即數),它們可以是8位、16位或32位(特別指出其位數的除外)。 ************************************************************************************************** 2、傳送—填充指令 ************************************************************************************************** 傳送—填充指令是把位數短的源操作數傳送給位數長的目的操作數。指令格式如下: MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm     其中:80386+表示80386及其之後的CPU,其它類似符號含義類同,不再說明。指令的主要功能和限制與MOV指令類似,不同之處是:在傳送時,對目的操作數的高位進行填充。根據其填充方式,又分爲:符號填充和零填充。 符號填充指令MOVSX MOVSX的填充方式是:用源操作數的符號位來填充目的操作數的高位數據位 零填充指令MOVZX MOVZX的填充方式是:恆用0來填充目的操作數的高位數據位 例如,AL=87H,指令MOVSX CX, AL;MOVZX DX, AL執行後,問CX和DX的值是什麼? 根據傳送-填充指令的填充方式可知:指令MOVSX CX, AL執行後,(CX)=0FF87H,指令MOVZX DX, AL執行後,(DX)=0087H。 從上例可看出,兩條指令的源操作數完全一樣,但因爲它們的填充方式不同,所得到的結果而就不同。 ************************************************************************************************** 3、交換指令XCHG ************************************************************************************************** 交換指令XCHG是兩個寄存器,寄存器和內存變量之間內容的交換指令,兩個操作數的數據類型要相同。其指令格式如下: XCHG Reg/Mem, Reg/Mem 例如,AX=5678H,BX=1234H,指令XCHG AX, BX執行後,AX和BX的值是什麼? 這是兩個寄存器內容進行交換,指令執行後,有:(AX)=1234H,(BX)=5678H。 ************************************************************************************************** 4、取有效地址指令LEA(Load) ************************************************************************************************** 指令LEA是把一個內存變量的有效地址送給指定的寄存器。其指令格式如下: LEA Reg, Mem ************************************************************************************************** 5、取段寄存器指令該組指令的功能是把內存單元的一個“低字”傳送給指令中指定的16位寄存器,把隨後的一個“高字”傳給相應的段寄存器(DS、ES、FS、GS和SS)。其指令格式如下: LDS/LES/LFS/LGS/LSS Reg, Mem ************************************************************************************************** 6、堆棧操作指令 ************************************************************************************************** 堆棧是一個重要的數據結構,它具有“先進後出”的特點,通常用來保存程序的返回地址。它主要有兩大類操作:進/壓棧操作和出/彈棧操作。 1)、進棧操作 、PUSH 指令格式:PUSH Reg/Mem PUSH Imm          一個字進棧,系統自動完成兩步操作:SP←SP-2,(SP)←操作數; 一個雙字進棧,系統自動完成兩步操作:ESP←ESP-4,(ESP)←操作數。 、PUSHA 指令格式:PUSHA      其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等壓棧。 、PUSHAD 指令格式:PUSHAD      其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等壓棧。 2)、出棧操作、POP 指令格式:POP Reg/Mem 彈出一個字,系統自動完成兩步操作:操作數←(SP),SP←SP+2; 彈出一個雙字,系統自動完成兩步操作:操作數←(ESP),ESP←ESP+4。 、POPA 指令格式:POPA       其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等彈出棧。其實,程序員不用記住它們的具體順序,只要與指令PUSHA對稱使用就可以了。 、POPAD 指令格式:POPAD    其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等彈出棧,它與PUSHAD對稱使用即可。 ************************************************************************************************** 彙編(241897582) 22:42:28 算術運算指令算術運算指令是反映CPU計算能力的一組指令,也是編程時經常使用的一組指令。它包括:加、減、乘、除及其相關的輔助指令。 該組指令的操作數可以是8位、16位和32位(80386+)。當存儲單元是該類指令的操作數時,該操作數的尋址方式可以是任意一種存儲單元尋址方式。 1、加法指令 指令的格式:ADD Reg/Mem, Reg/Mem/Imm 受影響的標誌位:AF、CF、OF、PF、SF和ZF 指令的功能是把源操作數的值加到目的操作數中。 、帶進位加指令ADC(見得較少) 指令的格式:ADC Reg/Mem, Reg/Mem/Imm 受影響的標誌位:AF、CF、OF、PF、SF和ZF 指令的功能是把源操作數和進位標誌位CF的值(0/1)一起加到目的操作數中。 、加1指令INC 指令的格式:INC Reg/Mem 受影響的標誌位:AF、OF、PF、SF和ZF,不影響CF 指令的功能是把操作數的值加1。 、交換加指令XADD(見得較少) 指令的格式:XADD Reg/Mem, Reg     受影響的標誌位:AF、CF、OF、PF、SF和ZF 指令的功能是先交換兩個操作數的值,再進行算術“加”法操作 2、減法指令 、減法指令SUB 指令的格式:SUB Reg/Mem, Reg/Mem/Imm 受影響的標誌位:AF、CF、OF、PF、SF和ZF 指令的功能是從目的操作數中減去源操作數。 、帶借位減SBB(見得較少) 指令的格式:SBB Reg/Mem, Reg/Mem/Imm 受影響的標誌位:AF、CF、OF、PF、SF和ZF 指令的功能是把源操作數和標誌位CF的值從目的操作數中一起減去。 、減1指令DEC 指令的格式:DEC Reg/Mem 受影響的標誌位:AF、OF、PF、SF和ZF,不影響CF 指令的功能是把操作數的值減去1。 、求補指令NEG 指令的格式:NEG Reg/Mem 受影響的標誌位:AF、CF、OF、PF、SF和ZF 指令的功能:操作數=0-操作數,即改變操作數的正負號 3、乘法指令 計算機的乘法指令分爲無符號乘法指令和有符號乘法指令,它們的唯一區別就在於:數據的最高位是作爲“數值”參與運算,還是作爲“符號位”參與運算。 乘法指令的被乘數都是隱含操作數,乘數在指令中顯式地寫出來。CPU會根據乘數是8位、16位,還是32位操作數,來自動選用被乘數:AL、AX或EAX。 指令的功能是把顯式操作數和隱含操作數相乘,並把乘積存入相應的寄存器中。 、無符號數乘法指令MUL/FMUL 指令的格式:MUL Reg/Mem 受影響的標誌位:CF和OF(AF、PF、SF和ZF無定義) 指令的功能是把顯式操作數和隱含操作數(都作爲無符號數)相乘 、有符號數乘法指令IMUL/FIMUL 指令的格式: IMUL Reg/Mem IMUL Reg, Imm IMUL Reg, Reg, Imm IMUL Reg, Reg/Mem 4、除法指令 除法指令的被除數是隱含操作數,除數在指令中顯式地寫出來。CPU會根據除數是8位、16位,還是32位,來自動選用被除數AX、DX-AX,還是EDX-EAX。 除法指令功能是用顯式操作數去除隱含操作數,可得到商和餘數。當除數爲0,或商超出數據類型所能表示的範圍時,系統會自動產生0號中斷。 、無符號數除法指令DIV/FDIV 指令的格式:DIV Reg/Mem 指令的功能是用顯式操作數去除隱含操作數(都作爲無符號數)。指令對標誌位的影響無定義。 、有符號數除法指令IDIV/FIDIV 指令的格式:IDIV Reg/Mem 受影響的標誌位:AF、CF、OF、PF、SF和ZF 彙編(241897582) 22:55:10 3、乘法指令 4、除法指令 (注意:被乘數,被除數的隱含位置) 彙編(241897582) 22:56:12 邏輯運算指令 邏輯運算指令是另一組重要的指令,它包括:邏輯與(AND)、邏輯或(OR)、邏輯非(NOT)和異或指令(XOR),邏輯運算指令也是經常使用的指令。 1、邏輯與操作指令AND 指令的格式:AND Reg/Mem, Reg/Mem/Imm 受影響的標誌位:CF(0)、OF(0)、PF、SF和ZF(AF無定義) 指令的功能是把源操作數中的每位二進制與目的操作數中的相應二進制進行邏輯“與操作”,操作結果存入目標操作數中。 2、邏輯或操作指令OR 指令的格式:OR Reg/Mem, Reg/Mem/Imm 受影響的標誌位:CF(0)、OF(0)、PF、SF和ZF(AF無定義) 指令的功能是把源操作數中的每位二進制與目的操作數中的相應二進制進行邏輯"或操作",操作結果存入目標操作數中。 3、邏輯非操作指令NOT 指令的格式:NOT Reg/Mem 其功能是把操作數中的每位變反,即:1←0,0←1。指令的執行不影響任何標誌位。 4、邏輯異或操作指令XOR 指令的格式:XOR Reg/Mem, Reg/Mem/Imm 受影響的標誌位:CF(0)、OF(0)、PF、SF和ZF(AF無定義) 指令的功能是把源操作數中的每位二進制與目的操作數中的相應二進制進行邏輯"異或操作",操作結果存入目標操作數中。 mov....--->00402536 call... .... .... xor eax,eax--->返回爲0//or eax,eax retn je/jz..--->0040253C 彙編(241897582) 23:00:24 今兒我才明白原來乘除法運行時被乘數和被除數是隱含在AL、AX或EAX。AX、DX-AX,還是EDX-EAX。了,以前沒有意識到. 彙編(241897582) 23:03:40 指令:操作數 這種格式的用法,只有一個操作數的,估計都差不多是隱含關係,可能是系統自動完成的.比如push 和 pop 你看符合這種格式,但系統自動完成兩步操作.這是隱含操作了. 彙編(241897582) 23:08:29 檢測位指令TEST 檢測位指令是把二個操作數進行邏輯“與”操作,並根據運算結果設置相應的標誌位,但並不保存該運算結果,所以,不會改變指令中的操作數。在該指令後,通常用JE、JNE、JZ和JNZ等條件轉移指令。 指令的格式:TEST Reg/Mem, Reg/Mem/Imm 受影響的標誌位:CF(0)、OF(0)、PF、SF和ZF(AF無定義) call XXXXXXXX test al,al/eax,eax... je/jne... ************************************************************************************************** 循環指令本身的執行不影響任何標誌位。 1、循環指令 循環指令LOOP的一般格式: LOOP 標號 LOOPW 標號      ;CX作爲循環計數器 LOOPD 標號      ;ECX作爲循環計數器 .... .... inc eax dex ebx cmp eax,ebx jne/je XXXX ^ 求1+2+…+1000之和,並把結果存入AX中。 方法1:因爲計數器CX只能遞減,所以,可把求和式子改變爲:1000+999+…+2+1。 … XOR AX, AX MOV CX, 1000D again: ADD AX, CX ;計算過程:1000+999+…+2+1 DEC CX LOOP again … 方法2:不用循環計數器進行累加,求和式子仍爲:1+2+…+999+1000。 … XOR AX, AX MOV CX, 1000D MOV BX, 1 again: ADD AX, BX ;計算過程:1+2+…+999+1000 INC BX LOOP again … 從程序段的效果來看:方法1要比方法2好。爲什麼?^_^ ************************************************************************************************** 轉移指令轉移指令是彙編語言程序員經常使用的一組指令。在高級語言中,時常有“儘量不要使用轉移語句”的勸告,但如果在彙編語言的程序中也儘量不用轉移語句,那麼該程序要麼無法編寫,要麼沒有多少功能,所以,在彙編語言中,不但要使用轉移指令,而且還要靈活運用,因爲指令系統中有大量的轉移指令。 轉移指令分無條件轉移指令和有條件轉移指令兩大類。 1、無條件轉移指令 無條件轉移指令包括:JMP、子程序的調用和返回指令、中斷的調用和返回指令等。 下面只介紹無條件轉移指令JMP JMP指令的一般形式: JMP 標號/Reg/Mem 2、條件轉移指令 條件轉移指令是一組極其重要的轉移指令,它根據標誌寄存器中的一個(或多個)標誌位來決定是否需要轉移,這就爲實現多功能程序提供了必要的手段。微機的指令系統提供了豐富的條件轉移指令來滿足各種不同的轉移需要,在編程序時,要對它們靈活運用。 條件轉移指令又分三大類:基於無符號數的條件轉移指令、基於有符號數的條件轉移指令和基於特殊算術標誌位的條件轉移指令。 、無符號數的條件轉移指令 指令的助憶符 JE/JZ ZF=1 Jump Equal or Jump Zero JNE/JNZ ZF=0 Jump Not Equal or Jump Not Zero JA/JNBE CF=0 and ZF=0 Jump Above or Jump Not Below or Equal JAE/JNB CF=0 Jump Above or Equal or Jump Not Below JB/JNAE CF=1 Jump Below or Jump Not Above or Equal JBE/JNA CF=1 or AF=1 Jump Below or Equal or Jump Not Above 、有符號數的條件轉移指令 指令的助憶符 JE/JZ ZF=1 Jump Equal or Jump Zero JNE/JNZ ZF=0 Jump Not Equal or Jump Not Zero JG/JNLE ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal JGE/JNL SF=OF Jump Greater or Equal or Jump Not Less JL/JNGE SF≠OF Jump Less or Jump Not Greater or Equal JLE/JNG ZF=1 or SF≠OF Jump Less or Equal or Jump Not Greater 、特殊算術標誌位的條件轉移指令 指令的助憶符 檢測的轉移條件 功能描述 JC CF=1 Jump Carry JNC CF=0 Jump Not Carry JO OF=1 Jump Overflow JNO OF=0 Jump Not Overflow JP/JPE PF=1 Jump Parity or Jump Parity Even JNP/JPO PF=0 Jump Not Parity or Jump Parity Odd JS SF=1 Jump Sign (negative) JNS SF=0 Jump No Sign (positive) 例,已知一個字節變量char,試編寫一程序段,把其所存的大寫字母變成小寫字母。 解: next: … char DB 'F' ;變量說明 … MOV AL, char CMP AL, 'A' JB next ;注意:字符是無符號數,不要使用指令JL CMP AL, 'Z' JA next ADD char, 20 彙編(241897582) 23:25:58 1、子程序的調用和返回指令 子程序的調用和返回是一對互逆操作,也是一種特殊的轉移操作。一方面,之所以說是轉移,是因爲當調用一個子程序時,程序的執行順序被改變,CPU將轉而執行子程序中的指令序列,在這方面,調用子程序的操作含有轉移指令的功能,子程序的返回指令的轉移特性與此類似;另一方面,轉移指令是一種“一去不復返”的操作,而當子程序完後,還要求CPU能轉而執行調用指令之下的指令,它是一種“有去有回”的操作。爲了滿足子程序調用和返回操作的特殊性,在指令系統中設置了相應的特定指令。 1、1調用指令(CALL) 調用子程序指令的格式如下: CALL 子程序名/Reg/Mem 子程序的調用指令分爲近(near)調用和遠(far)調用。如果被調用子程序的屬性是近的,那麼,CALL指令將產生一個近調用,它把該指令之後地址的偏移量(用一個字來表示的)壓棧,把被調用子程序入口地址的偏移量送給指令指針寄存器IP即可實現執行程序的轉移 如果被調用子程序的屬性是遠的,那麼,CALL指令將產生一個遠調用。這時,調用指令不僅要把該指令之後地址的偏移量壓進棧,而且也要把段寄存器CS的值壓進棧。在此之後,再把被調用子程序入口地址的偏移量和段值分別送給IP和CS,這樣完成了子程序的遠調用操作 00405600 call 00406895 00405604 ...... 子程序調用指令本身的執行不影響任何標誌位,但子程序體中指令的執行會改變標誌位,所以,如果希望子程序的執行不能改變調用指令前後的標誌位,那麼,就要在子程序的開始處保護標誌位,在子程序的返回前恢復標誌位。 例如: CALL DISPLAY ;DISPLAY是子程序名 CALL BX ;BX的內容是子程序的偏移量 CALL WORD1 ;WORD1是內存字變量,其值是子程序的偏移量 CALL DWORD1 ;DWORD1是雙字變量,其值是子程序的偏移量和段值 CALL word ptr [BX] ;BX所指內存字單元的值是子程序的偏移量 CALL dword ptr [BX] ;BX所指內存雙字單元的值是子程序的偏移量和段值 1、2返回指令(RET) 當子程序執行完時,需要返回到調用它的程序之中。爲實現此功能,指令系統提供了一條專用的返回指令。其格式如下: RET/RETN/RETF [Imm] 子程序的返回在功能上是子程序調用的逆操作。爲了與子程序的遠、近調用相對應,子程序的返

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章