大學裡的微機原理課學的讓我汗顏,工作之餘,重新學習了一遍x86的彙編。
彙編主要包括暫存器,指令操作,控制迴圈結構以及棧幀中的%esp和%ebp的變化。
32位x86包括8個暫存器,分別是%eax(accumulate),%ecx(conuter),%edx(data),%ebx(base), %esi(source index), %edi(dest index),%esp(stack pointer),%ebp(base pointer),其中前4個暫存器分別有它的低8位(al),低16位(ax),低16位中的高8位暫存器(ah),因此,對應的指令集應按照不同的bit位來使用。暫存器的定址方式可以分為直接定址,暫存器定址,和記憶體定址。例如:movl $3, %eax為直接定址,movl %eax,%edx為暫存器定址,movl 8(%eax,%edx,4),%eax為記憶體定址。
下面就是介紹x86的指令了。最熟悉的莫過於mov指令了。從8086我們就愛上了它,現在我們把它做點拓展,讓它用於32位的暫存器。於是就有了如下幾條:普通的有movb,movw,movl, 有符號資料傳輸指令有movsbw,movsbl,movswl,無符號指令(即高位做了0擴充套件)有movzbw,movzbl,movzwl。另外2條比較重要的資料指令是pushl和popl,分別是入棧和出棧操作。算術邏輯指令有:leal,inc,dec,neg,not,add,sub,imul,xor,or,and,sal,shl,sar,shr。注意位元組數對指令集操作的影響。
控制指令中,比較的2個指令cmp和test,前乙個比較大小,後乙個判斷是否為0,通過該指令的操作,改變cf,zf,of,sf的標誌位,接著使用訪問條件碼的指令來判斷大小,從而決定程式的走向。跳轉指令:jmp。在c中,while,do{}while(),for(),switch等條件迴圈語句,編譯成彙編**後,均是通過cmp或test,判斷不同的條件,從而決定jmp的位置,而且需要注意的是c翻譯成彙編**後,由於編譯器的優化,可能產生一定的區別。例如 x = 0,翻譯為彙編後應該是xor %eax,%eax,而不是movl $0,%eax,因為當我們看機器碼的時候,會發現前一條指令的位元組數為3,而後一條指令的位元組數為5。
另外乙個重要的內容是棧幀結構的變化過程,也就是我們的函式呼叫過程在棧中是怎麼運作的。這裡的幾條指令有:call,level,ret。
看下面的例子,call指令呼叫乙個函式後,該指令的的後乙個位址0x8048553會存入棧中,而main段指令執行結束後,會跳轉到該位址,也就是main段最後的ret指令跳轉的位址。
通過遞迴函式我們可以很好的理解棧幀的變化。上圖右邊是棧幀的結構,具體的遞迴流程就不說了,找張紙畫一下就可以了。
在c語言中,結構體通常的情形是按著4/8位元組對齊,究其原因是保證結構體中的成員為x的倍數,保證某些指令要求儲存器位址為16的倍數的要求。
bomblab和buflab沒有條件做好遺憾,哎,要是在學校就好了。珍惜現在吧,童鞋們!
x86彙編學習筆記
debug 是dos,windows都提供的實模式 8086 方式 程式的除錯工具.windows下使用dosbox模擬dos環境,掛載所在目錄後開啟debug.exe r指令 顯示r ax 0000 bx 0000 cx 0000 dx 0000 sp 00fd bp 0000 si 0000 d...
170824 彙編 x86基礎
a.1625 5 王子昂 總結 2017年8月24日 連續第325天總結 b.逆向知識 資料移動分為5種方式 立即數到暫存器 立即數到記憶體 暫存器到暫存器 暫存器到記憶體或記憶體到暫存器 記憶體到記憶體 前4種是所有現代體系都支援的,第五種是x86獨有的,可以通過inc add來直接操作記憶體 另...
X86彙編指令詳解
x86彙編基本分為七大體系 分別是 1 資料傳送指令 2 算術運算指令 3 邏輯運算指令 4 串操作指令 5 控制轉移指令 6 處理器控制指令 7 保護方式指令 先介紹資料傳送指令集 1 資料傳送指令 1.mov 格式 mov destination,source 功能 將s ource中的資料傳送...