編譯原理—寄存器和指令入門

指令樣例

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結構中有兩個變址寄存器:ESEDI

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]

常用於訪問結構

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