eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 匯編語言中CPU上的通用寄存器的名稱,是32位的寄存器。如果用C語言來解釋,可以把這些寄存器當作變量看待。
EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
EBX 是"基地址"(base)寄存器, 在內存尋址時存放基地址。
ECX 是計數器(counter), 是重復(REP)前綴指令和LOOP指令的內定計數器。
EDX 則總是被用來放整數除法產生的余數。
ESP:寄存器存放當前線程的棧頂指針
EBP:寄存器存放當前線程的棧底指針
EIP:寄存器存放下一個CPU指令存放的內存地址,當CPU執行完當前的指令后,從EIP寄存器中讀取下一條指令的內存地址,然后繼續執行。
ESI/EDI分別叫做"源/目標索引寄存器"(source/destination index),因為在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目標串.
EBP是"基址指針"(BASE POINTER), 它最經常被用作高級語言函數調用的"框架指針"(frame pointer).
MOV指令是數據傳送指令,也是最基本的編程指令,用于將一個數據從源地址傳送到目標地址(寄存器間的數據傳送本質上也是一樣的)。其特點是不破壞源地址單元的內容。
例如:
MOV AX,2000H;將16位數據2000H傳送到AX寄存器
MOV AL,20H;將8位數據20H傳送到AL寄存器
MOV AX,BX;將BX寄存器的16位數據傳送到AX寄存器
MOV AL,[2000H];將2000H單元的內容傳送到AL寄存器
需要注意的是:
(1)兩個存儲單元之間不能直接傳送數據,即:MOV指令只允許一個操作數在存儲器中。MOV [SI],[2000H];這是錯誤的
(2)MOV指令中立即數不能直接傳送給段寄存器(CS、DS、SS、ES)和IP;段寄存器之間不能直接傳送。MOV IP,2000 H ;這是錯誤的
(3)CS和IP不能作為目的操作數。MOV CS,AX ;這是錯誤的
(4)MOV指令中立即數不能作目標操作數。MOV 2000H,[SI] ;這是錯誤的
jmp指令用法總結:
1.直接用法(只能在Debug下使用的匯編指令):
jmp 段地址:偏移地址
功能:修改CS、IP的內容
例子:jmp 55BA:8
執行后:(CS)=55EAH, (IP)=0008H
2.根據標號進行轉移的用法:
(1).轉移的目的地址不在指令中,依據位移進行轉移(段內轉移)
a.jmp short 標號(IP的修改范圍為-128至127)
功能:(IP)=(IP)+8位位移
b.jmp near ptr 標號(IP的修改范圍為-32768至32767)
功能:(IP)=(IP)+16位位移
注:依據位移進行的轉移是段內轉移,位移=標號處的地址-jmp指令后的第一個字節的地址。
(2).轉移的目的地址在指令中(段間轉移)
jmp far ptr 標號
功能:用標號的段地址和偏移地址修改CS和IP
(CS)=標號所在段的段地址;(IP)=標號所在段的偏移地址
3.轉移地址在寄存器中的用法:
jmp 某一合法寄存器
功能:用寄存器中的值修改IP
例子:jmp ax
執行后:(IP)=(ax)
注意:合法寄存器是指通用寄存器。一個有趣的現象:jmp ip在debug下調試也是
錯誤的。字面上理解:(IP)=(IP),但CPU并不支持
4.轉移地址在內存中的用法:
(1).jmp word ptr 內存單元地址(段內轉移)
功能:從內存單元地址出開始存放著一個字,是轉移的目的偏移地址
例子:mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
執行后:(IP)=0123H
(2).jmp dword ptr 內存單元地址(段間轉移)
功能:從內存單元地址處開始存放著兩個字,高地址處的字是轉移的目的段地址,低地址處是轉移的目的偏移地址
例子:mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
執行后:(CS)=0, (IP)=0123H
CALL和RET
CALL指令的步驟:首先是將返回地址(也就是call指令要執行時EIP的值)壓入棧頂,然后是將程序跳轉到當前調用的方法的起始地址。執行push和jump指令。
RET指令則是將棧頂的返回地址彈出到EIP,然后按照EIP此時指示的指令地址繼續執行程序。
pop和push
出棧進棧