1. 程式人生 > >80X86定址方式與常見彙編指令

80X86定址方式與常見彙編指令

1、指令      指令:操作碼和運算元組成(不定有運算元);      操作碼:執行操作,用一個唯一的助記符表示,對應著機器指令的一個二進位制編碼;      運算元:操作物件,可以是數值,暫存器或儲存器地址;      助記符格式:      操作碼  目的運算元,源運算元;註釋      指令運算元:      r8:任一8位通用暫存器;      r16:任一16位通用暫存器;      reg:r8 或 r16;      seg:段暫存器(CS/SS/DS/ES);      m8:8位儲存器運算元單元;      m16::16位儲存器運算元單元;      mem:m8 或 m16;      i8:8位立即數;      i16:16位立即數;      imm:i8 或 i16;      dest:目的運算元;      src:源運算元;      同一定址方式的不同表達:      MOV AX,[BX][SI]      ;等同  MOV AX,[BX+SI]      MOV AX,15[SI]        ;等同  MOV AX,[15+SI]      MOV AX,15[BX][SI]  ;等同  MOV AX,15[BX+SI]  或  MOV AX,[15+BX+SI]  2、定址方式      分為3種定址方式:      立即數定址:指令中運算元直接放在機器程式碼中,緊跟操作碼之後,常用來給暫存器賦值;      暫存器定址:運算元存放在暫存器中,可以是r8,r16,seg;      儲存器定址:指令中給出運算元的偏移地址,而段地址在預設的或段超越字首指定的段暫存器中;                          定址方式:                          a.直接定址:有效地址在指令中直接給出,預設段地址在DS中,可使用段超越字首改變;                          b.暫存器間接定址:有效地址存放在基址暫存器BX或變址暫存器SI、DI中,段地址同上;                                                                                      c.暫存器相對定址:有效地址是暫存器內容與i8或i16之和,暫存器可為BX、BP、SI、DI,                          段地址對應BX/SI/DI暫存器預設是DS,對應BP暫存器預設為SS,可使用段超越字首改變;                          d.基址變址定址:有效地址由基址暫存器(BX/BP)內容加上變址暫存器(SI/DI)內容構成,                          段地址對應BX預設為DS,對應BP預設為SS,可使用段超越字首改變;                          e.相對基址變址定址:有效地址由基址暫存器(BX/BP)、變址暫存器(SI/DI)與i8或i16構成,                          段地址對應BX預設為DS,對應BP預設為SS,可使用段超越字首改變;      棧:      主存區域,位於堆疊段中,邏輯上存在,遵循後進先出(LIFO) 或 先進後出(FILO),段地址在SS段暫存器中;      特徵:      a.只有一個出口,即當前棧頂,用堆疊指標暫存器SP指定,SS:SP指向當前棧的棧頂;      b.棧頂是地址較小一端,棧底為高地址端;      c.棧操作均以字為單位進行;      d.字量資料從棧頂壓入和彈出時,低地址送低位元組,高地址送高位元組;      e.每個函式均開闢屬於自己的棧幀;      f.雖遵循先進後出原則,但也可用儲存器定址方式隨機存取棧中的資料;      用途:      a.臨時存放資料      b.傳遞引數      c.儲存和恢復暫存器      操作:      PUSH:進棧指令先使堆疊指標SP減2,然後將一個字運算元放入堆疊頂部;      POP  :出棧指令將棧頂的一個字傳送到指定的目的運算元,然後堆疊指標SP加2;      PUSH r16/m16/reg      POP   r16/m16/reg 3、彙編指令      資料傳輸指令:      MOV:移動資料      PUSH:入棧      POP:出棧      XCHG:交換      LEA:有效地址傳送      PUSHF/POPF:標誌暫存器進棧/出棧      PUSHA/POPA:暫存器狀態壓入/彈出堆疊      算數與邏輯運算指令:      ADD:加法      ADC:帶進位加法(額外加上CF標誌,上一條指令結果影響)      INC:加1(CF標誌不變,其它狀態標誌均受影響)      SUB:減法      SBB:帶借位減法(額外減去CF標誌,上一條指令結果影響)      DEC:減1(CF標誌狀態不變)      MUL:無符號乘法(單運算元,目標運算元為AL、AX或EAX中的隱式運算元)      IMUL:有符號乘法(單運算元、雙運算元、三運算元3種,任何一種都是兩個運算元參與運算);      DIV:無符號除法(單運算元,目標運算元為AX/DX:AX/EDX/EAX);      IDIV:有符號除法(單運算元,目標運算元為AL/AX/EAX中的值,結果存入AX/DX:AX/EDX:EAX,防止溢位)      CMP:比較(實際上為減,不儲存結果,根據結果設定EFLAGS中的狀態標誌);      AND:邏輯與(逐位與)      OR:邏輯或(逐位或)      XOR:邏輯異或(逐位異或)      NOT:邏輯非(逐位非)      TEST:邏輯比較(逐位與,根據結果設定SF、ZF、PF,丟棄結果)      串操作指令:      MOVS:串傳送      STOS:存入串(STOSB/STOSW/STOSD,將AL/AX/EAX中的位元組/字/雙字存入目標運算元);      LODS:取出串(LODSB/LODSW/LODSD,將源運算元中的位元組/字/雙字載入到AL/AX/EAX);      CMPS:串比較(CMPB/CMPW/CMPD,比較運算元指定的位元組/字/雙字,根據結果設定EFLAGS中的狀態標識);      REP:重複操作字首(REP/REPE/REPNE,按CX指定的次數重複執行字串指令,或是ZF標識不再滿足指定的條件為止)      重複條件:      REP     :CX!=0;      REPE   :CX!=0 且 ZF==1;      REPNE :CX!=0 且 ZF!=1;       控制轉移指令:      JMP  :無條件轉移,跳轉到指定目標地址處,從目標地址處開始執行;      Jcc    :有條件轉移      LOOP:迴圈      CALL :函式呼叫(CS : IP入棧,跳轉)      RET    :返回(帶一個立即數 i16,堆疊指標SP增加,清除執行CALL前入棧的引數,即平衡堆疊);      三種轉移方式:      短轉移(short):段內轉移,在段內 -128~+127範圍內轉移,即在一個位元組之內;      近轉移(near):段內轉移,在當前程式碼段64KB範圍內轉移,無需更改CS段地址,只需改變IP偏移地址;      遠轉移(far):段間轉移,在1MB範圍內,需要更改CS段地址和IP偏移地址;                   目標地址必須用一個32位數表達,稱為32位遠指標,是一個邏輯地址;      實際程式設計時,彙編程式會根據目標地址的距離,自動處理成短轉移、近轉移或遠轉移;      當然,我們也可以使用short/near ptr/far ptr 強制轉移。