題記
因工作中經常用到反彙編解一些算法,故對次有一定的接觸,爲了更進一步理解C、C++、VC等他們的特性,記下一些東西,就當自娛自樂了。
彙編初步
1 80x86彙編
1.1 寄存器
32位CPU所含有的寄存器分類簡介:
1.1.1 數據寄存器(EAX、EBX、ECX和EDX)
數據寄存器主要用來保存操作數和運算結果等信息。
寄存器的低16位分別是:AX、BX、CX和DX,每個16位寄存器又可以分爲兩個8位寄存器。
32位寄存器 |
EAX |
EBX |
ECX |
EDX |
||||||||
16位寄存器 |
--- |
AX |
--- |
BX |
--- |
CX |
--- |
DX |
||||
8位寄存器 |
--- |
AH |
AL |
--- |
BH |
BL |
--- |
CH |
CL |
--- |
DH |
DL |
1.1.2 2個變址寄存器(ESI和EDI)
低16位分別是SI和DI。通常在串操作中,ESI保存源地址,EDI保存目標地址。
1.1.3 2個指針寄存器(ESP和EBP)
低16位分別是SP和BP。
ESP是堆棧指針寄存器,保存堆棧指針,永遠指向棧頂;EBP保存基址指針。
1.1.4 6個段寄存器(ES、CS、SS、DS、FS和GS)
ECS——代碼段寄存器(Code Segment Register),其值爲代碼段的段值;
EDS——數據段寄存器(Data Segment Register),其值爲數據段的段值;
EES——附加段寄存器(Extra Segment Register),其值爲附加數據段的段值;
ESS——堆棧段寄存器(Stack Segment Register),其值爲堆棧段的段值;
EFS——附加段寄存器(Extra Segment Register),其值爲附加數據段的段值;
EGS——附加段寄存器(Extra Segment Register),其值爲附加數據段的段值。
1.1.5 1個指令指針寄存器(EIP)
指向下一條將要執行的指令
1.1.6 1個標誌寄存器(EFlags)
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
OF |
DF |
IF |
TF |
SF |
ZF |
|
AF |
|
PF |
|
CF |
運算結果標誌包括以下6位:
OF(Overflow Flag)溢出標誌,在運算過程中,如操作數超出了機器能表示的範圍,則稱爲溢出。此時OF位置1,否則置0。
SF(Sign Flag)符號標誌,記錄運算結果的符號,結果爲負時置1,否則置0。
ZF(Zero Flag)零標誌,運算結果爲0時ZF位置1,否則置0。
CF(Carry Flag)進位標誌,記錄運算時有效位產生的進位值。例如,執行加法指令時,最高有效位有進位時置1,否則置0。
AF(Auxiliary carry Falg)輔助進位標誌,記錄運算時第3位(半個字節)產生的進位值。例如,執行加法指令時第3位有進位時置1,否則置0。
PF(Parity Flag)奇偶標誌,用來爲機器中傳送信息時可能產生的代碼出錯情況提供檢驗條件。當結果操作數中1的個數爲偶數時置1,否則置0。
控制標識位有三個:
DF(Direction Flag)方向標誌,在串處理指令中控制處理信息的方向用。當DF位爲1時,每次操作後是變址寄存器SI和DI減量,這樣就是串處理從高地址向低地址方向處理。當DF爲0時,則使SI和DI增量,使串處理從低地址向高地址方向處理。8086/8088提供的專門用於設置方向標誌DF的指令是STF,專門用於清除DF的指令時CLD。
IF(Interrupt Flag)中斷向量,當IF爲1時,允許中斷,否則關閉中斷。有關中斷原理將在後面詳細講解。8086/8088提供的專門用於設置中斷允許標誌IF的指令是STI,專門用於清IF的指令是CLI。
TF(Trap Flag)追蹤標誌,用於單步操作方式,當追蹤標誌TF被置1後,CPU進入單步方式。所謂單步方式是指在一條指令執行後,產生一個單步中斷,這主要用於程序的調試。