指令樣例
mov (%edx), %eax // 將內存地址爲 EDX 的數據放入到 EAX 寄存器中
XCHG %edi %eax // 交換 EAX 和 EDI 寄存器的值
add %ebx, %eax // 將 EAX 和 EBX 相加,並將結果更新到 EAX 中
shl $4, %eax // 將 eax 邏輯左移 4 位
mov eax, 56 // 將 56H 的數據傳送給 EAX 寄存器
mov esi, dword ptr [eax*2+1] // 將內存地址爲 eax*2+1 處的4字節數據傳送給 esi 寄存器
mov ah, byte ptr [esi*2+eax] // 將內存地址爲 esi*2+eax 處的8位數據傳送到 ah 寄存器
mov dword ptr [esp+36],ebx // 將ebx 寄存器的值以 4 字節 傳送到堆棧地址爲 esp+36 所指的地方
push eax // 將 eax 寄存器的值以 4字節 壓棧,同時 esp-4
push dword ptf [12FF8589] // 將內存地址爲 12FF8589 所指向的值以 4字節 壓入堆棧,同時 ESP-4
pop dword ptr [12FF8589] // 將堆棧頂部的 4字節 彈出到內存地址
pop eax // 將堆棧頂部的 4 字節彈出到 eax 寄存器,同時 esp+4
通用寄存器
EAX寄存器
稱爲累加器,常用於算數運算、布爾操作、邏輯操作、返回函數等。
EBX寄存器
基址寄存器,常用於存檔內存地址。
CX寄存器
計數寄存器,常用於存放循環語句的循環次數,字符串操作中也常用。
EDX寄存器
數據寄存器,常和EAX一起使用。
這四個通用寄存器的用途並非固定不變。編譯器在編譯程序的時候,會根據很多因素,如編譯器、編譯條件、操作系統等作出相應的改變。
我們首先要知道自己的程序是用什麼的編譯器編譯的,然後參考具體的編譯器的說明。
變址寄存器
變址的含義是內存地址會變化,即變址寄存器中存放着變動的內存地址。
在80386結構中有兩個變址寄存器:ES和EDI。
ESI寄存器
源變址寄存器,通常存放要處理的數據的內存地址
EDI寄存器
目的變址寄存器,通常存放處理後的數據的內存地址
用途
ESI 和 EDI 一個存放來源數據地址,一個存放處理後的數據地址,常搭配起來使用,完成數據的賦值操作。
Rep movs dword ptr [edi], dword ptr [esi]
上述指令把 ESI 指向的內存地址中的內容,複製到 EDI 所指的內存中,複製的數據長度在 ECX 寄存器中指定。
指針寄存器
簡介
80386 的指針寄存器有 基址寄存器 EBP,堆棧指針寄存器 ESP 和指令指針寄存器 EIP。
其中指令指針寄存器 EIP 總是指向下一條要執行的指令的地址,一般情況下無需修改 EIP。
EBP寄存器
基址寄存器,作爲通用寄存器,用於存放操作數。常用來代替堆棧指針訪問堆棧中的數據。
ESP寄存器
堆棧指針寄存器,不可作爲通用寄存器使用,存放當前堆棧棧頂的地址。一般情況下,ESP 和 EBP 聯合使用來訪問函數中的參數和局部變量。
push ebp
mov ebp, esp
sub esp, 78
push esi
push edi
cmp dword ptr [ebp+8], 0
尋址方式和作用
立即尋址
mov eax, 56H
通常用於賦值
直接尋址
mov eax, [12558878H]
通常用於處理變量
寄存器尋址
mov eax, [edi]
地址在寄存器中
基址加變址尋址
mov eax, [ebp+esi]
常用於訪問結構