匯編
- 筆記
- 01進制
- 02進制運算
- 03二進制簡寫
- 04資料寬度
- 05無符號數有符號數
- 06原碼反碼補碼
- 07計算機不會做加法計算機只會位運算
- 08加減運算程序
- 09匯編學習環境搭建
- 10-11通用暫存器
- 12記憶體
- 13記憶體地址的5種形式
- 14小端存盤模式
- 15常用匯編指令
- 16常用匯編指令
- 17堆疊
- 18修改EIP的指令
- 19反除錯之Fake F8
- 20匯編眼中的函式
- 21通過堆疊形式傳遞引數
- 22堆疊平衡
- 23外掛
- 24ESP尋址
- 25EBP尋址
- 26JCC指令
筆記
1.視頻提供:昆山愛達人資訊技術有限公司
2.官方網址:www.bcdaren.com
01進制
1.二進制0和1
2.忘掉十進制,忘掉進制間的轉換
3.進制的定義:
八進制:由八個符號組成,分別是01234567逢八進一
十進制:由十個符號組成,分別是0123456789逢十進一
N進制的定義:由N個符號組成,逢N進一
4.進制的書寫:
5.1+1=3?
02進制運算
八進制運算
2+3=5 2×3=6 4+5=11 4×5=24
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27
277+333=632 236-54=162 276*54=20250 234/4=47
03二進制簡寫
0000 0001 0010 0011 0100 0101 0110 0111
0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111
8 9 A B C D E F
04資料寬度
資料寬度:
位bit 位元組byte 字word 雙字doubleword
存盤范圍:
位元組0-0xFF 字0-0xFFFF 雙字0-0xFFFFFFFF
05無符號數有符號數
1.無符號數的編碼規則:
16進制0x9A 10進制154 10011010
2.有符號數的編碼規則:
0正1負
int main(int argc, char*argv[])
{
Int x=0x9A000000;
printf{“以無符號形式顯示:%u\n”,x};
printf{“以有符號形式顯示:%d\n”,x};
return 0;
}
以無符號形式顯示:2583691264
以有符號形式顯示:-1711276032
06原碼反碼補碼
有符號數的編碼規則
原碼:最高位為符號位,其余各位為數值本身的絕對值
反碼:正數:反碼與原碼相同;負數:符號位為1,其余位對原碼取反
補碼:正數:補碼與原碼相同;負數:符號位為1,其余位對原碼取反加1
舉例說明
-1 : 原碼10000001 反碼:11111110 補碼:11111111
-7 : 原碼10000111 反碼:11111000 補碼:11111001
總結:1.正數原碼存盤2.負數補碼存盤
07計算機不會做加法計算機只會位運算
1.與運算:and(&)兩位都為1時,結果才為1
2.或運算:or(|)只要有一個為1就是1
3.異或運算:xor(^)不一樣的時候是1
4.非運算:not(~)0就是1,1就是0
5.左移:各二進制全部左移若干位,高位丟棄,低位補0
shl(<<) 1101 1000 左移2位為:0110 0000
6.右移:各二進制全部右移若干位,低位丟棄,高位補0或者補符號位
shr 1101 0101 0011 0101
對應C語言(>>)
unsigned int a=10;
printf(“%d\n”,a>>2);
sar 1101 0101 1111 0101 加符號位11
對應C語言(>>)
int a=10;
printf(“%d\n”,a>>2);
7.總結:計算機只會位運算
08加減運算程序
09匯編學習環境搭建
應用/安全
C語言--------匯編--------二進制
10-11通用暫存器
1.暫存器
存盤資料:
CPU>記憶體>硬碟
32位CPU:8 16 32
64位CPU:8 16 32 64
2.通用暫存器
32位通用暫存器
EXA ESP
ECX EBP
EDX ESI
EBX EDI
3.MOV指令
<1>立即數到暫存器
<2>暫存器到暫存器
12記憶體
1Byte=8bit 1KB=1024Byte 1MB=1024KB 1GB=1024KB
MOV指令
<1>立即數到記憶體
<2>暫存器到記憶體
<3>記憶體到暫存器
13記憶體地址的5種形式
1.形式一:[立即數]
讀取記憶體的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
向記憶體中寫入資料:
MOV DWORD PTR DS:[0x13FFC4],EAX
2.形式二:[reg]
reg代表暫存器 可以是8個通用暫存器中的任意一個
讀取記憶體的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]
向記憶體中寫入資料:
MOV ECX,0x13FFD8
MOV DWORD PTR DS:[EDX], 0x87654321
3.形式三:[reg+立即數]
讀取記憶體的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX+4]
向記憶體中寫入資料:
MOV ECX,0x13FFD8
MOV DWORD PTR DS:[EDX+0xC], 0x87654321
4.形式四:[reg+reg×{1,2,4,8}]
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX×4]
向記憶體中寫入資料:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX×4],87654321
14小端存盤模式
- 存盤模式
<1>mov byte ptr ds:[0x00000000],0x1A
<2>mov word ptr ds:[0x00000000],0x1A2C
<3>mov dword ptr ds:[0x00000000],0x1A2C3E4F
大端模式:資料高位在低位,資料低位在高位
小端模式:資料低位在低位,資料高位在高位 - DTDEBUG記憶體視窗的使用
<1>分別以位元組/字/雙字形式來查看記憶體(db dw dd)
<2>向記憶體中寫入四個位元組的資料,并觀察存盤形式(大端存盤/小端存盤)
15常用匯編指令
資料可以存在哪:暫存器、記憶體
資料是如何存放的:小端存盤
一.MOV指令
指令格式:
r通用暫存器
m代表記憶體
imm代表立即數
r8代表8位通用暫存器
m8代表8位記憶體
imm8代表8位立即數
1.MOV r/m8,r8
2. MOV r/m16,r16
3. MOV r/m32,r32
4. MOV r8,r/m8
5. MOV r16,r/m16
6. MOV r32,r/m32
7. MOV r8,imm8
8. MOV r16,imm16
9. MOV r32,imm32
二.ADD指令
指令格式:
1.ADD r/m8,imm8
2.ADD r/m16,imm16
3.ADD r/m32,imm32
4.ADD r/m16,imm8
5.ADD r/m32,imm8
6.ADD r/m8,r8
7.ADD r/m8,r16
8.ADD r/m32,r32
9. ADD r8,r/m8
10. ADD r16,r/m16
11. ADD r32,r/m32
三.SUB指令
指令格式
1.SUB r/m8,imm8
2.SUB r/m16,imm16
3.SUB r/m32,imm32
4.SUB r/m16,imm8
5.SUB r/m32,imm8
6.SUB r/m8,r8
7.SUB r/m8,r16
8.SUB r/m32,r32
9. SUB r8,r/m8
10. SUB r16,r/m16
11. SUB r32,r/m32
四.AND指令
五.OR指令
六.XOR指令
七.NOT指令
NOT r/m8
NOT r/m16
NOT r/m32
16常用匯編指令
1.MOVS指令:移動資料 記憶體-記憶體
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI]
例子:
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI] 觀察EDI的值
修改標志暫存器中D位的值,然后在執行下面的指令:
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]
2.STOS指令:講AI/AX/EAX的值存盤到[EDI]指定的記憶體單元
STOS BYTE PTR ES:[EDI] 簡寫為STOSB
STOS WORD PTR ES:[EDI] 簡寫為STOSW
STOS DWORD PTR ES:[EDI] 簡寫為STOSD
MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
修改標志暫存器中D位的值,然后在執行下面的指令:
MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI] 觀察EDI的值
3.REP指令:按計數暫存器(ECX)中指定的次數重復執行字串命令
MOV ECX,10
REP MOVSD
REP STOSD
17堆疊
1.什么是堆疊?
就是一塊記憶體,作業系統在程式啟動的時候已經分配好的,供程式執行時使用,
和資料結構的堆疊無關
查看堆疊
2.堆疊指標暫存器
ESP中存盤了當前的堆疊用到哪里了
3.堆疊的使用
<1>存盤資料
<2>修改堆疊頂指標
4.PUSH指令
功能:
<1>向堆疊中壓人資料
<2>修改堆疊頂指標ESP暫存器
指令格式:
PUSH r32
PUSH r16
PUSH m16
PUSH m32
PUSH imm8/imm16/imm32
5.POP指令
功能:
<1>向堆疊頂資料存盤到暫存器/記憶體
<2>修改堆疊頂指標ESP暫存器
指令格式:
- POP r32
- POP r16
- POP m16
- POP m32
18修改EIP的指令
1.JMP指令
MOV EIP,暫存器/立即數/記憶體 簡寫為 JMP暫存器/立即數/記憶體
2.CALL指令
PUSH下一行地址
MOV EIP,立即數/暫存器/記憶體 簡寫為 CALL暫存器/立即數/內
與JMP唯一的區別:
在堆疊中存盤Call指令下一行地址
3.RET指令
ADD ESP,4
MOV EIP,[ESP-4]簡寫為:RET
19反除錯之Fake F8
1.單步步入(F7) 單步步過(F8)
<1>單步步入與單步步過的區別
<2>除錯器實作原理:
斷電:0xCC
單步步入:設定EFLAGS的TF位
單步步過:在下一行設定斷點
20匯編眼中的函式
1.什么是函式
函式就是一系列指令的集合,為了完成某個會重復使用的特定功能
例子:向暫存器中賦值
2.如何執行一個函式?即函式呼叫
<1>用JMP來執行函式
<2>用CALL來執行函式
3.什么是引數?什么是回傳值?
例子:撰寫一個函式,能夠得到任意2個整數的值
21通過堆疊形式傳遞引數
22堆疊平衡
什么是堆疊平衡?
1)如果要回傳父程式,則當我們在堆疊中進行堆疊的操作的時候,一定要保證在RET這條指令之前,ESP指向的是我們壓入堆疊中的地址,
2)如果通過堆疊傳遞引數了,那么在函式執行完畢后,要平衡引數導致的堆疊變化,
23外掛
24ESP尋址
1.暫存器傳參與堆疊傳參
2.ESP尋址
25EBP尋址
26JCC指令
1.標志暫存器:EFLAGS
2.CF(bit 0)[Carry flag]
若計算操作產生的結果在最高有效位(most-significant bit)發生進位或借位則將其置1,反之清零,
這個標志通常用來指示無符號整型運算的溢位狀態,
例:
MOV AL,0XFE
ADD AL,2
或者
MOV AL,0X7F
SUB AL,0xFF
3.PF(bit 2)[Parity flag]
如果結果的最低有效位元組(least-significant byte)包含偶數個1位則該位置1,否則清零,
利用PF可進行奇偶校驗檢查:
需要傳輸”11001110”,資料中含5個”1”,所以其奇校驗位為”0”,同時把”110011100”傳輸給接收方,接收方收到資料后再一次計算奇偶性,”110011100”中仍然含有5個”1”,所以接收方計算出的奇校驗位還是”0”,與發送方一致,表示在此次傳輸程序中未發生錯誤,
例:
MOV AL,0CE
ADD AL,0
4.AF(bit 4)[Auxiliary Carry flag]
如果算術操作在結果的第3位發生進位或借位則將該標志置1,否則清零,
這個標志在BDC(binary-code decimal)算術運算中被使用,
5.ZF(bit 6)[Zero flag]
若結果為0則將其置1,反之清零,
經常與CMP或者TEST等指令一起使用
例1:判斷2個值是否相等
MOV EAX,100
MOV ECX,100
CMP EAX,ECX
(CMP指令相當于SUB指令,但是相減的結果并不保存到第一個運算元中)
例2:判斷某個值是否為0
TEST EAX,EAX
(TEAT指令相當于AND指令,但是與的結果并不保存到第一個運算元中)
6.SF(bit 7)[Sign flag]
該標志被設定為有符號整型的最高有效位
(0指示結果為正,反之則為負)
例:
MOV AL,0X7F
ADD AL,2
或者
MOV AL,0XFE
ADD AL,2
7.OF(bit 11)[Overflow flag]
溢位標志OF用于反映有符號數加減運算所得結果是否溢位
可以這樣理解:
如果是無符號數運算,是否溢位看CF位,
如果是有符號數運算,是否溢位看OF位
例:
MOV AL,0x7F
ADD AL,2
8.DF(bit 10)[Direction Flag]
這個方向標志控制串指令(MOVS,CMPS,SCAS,LODS以及STOS),設定DF標志使得串指令自動增減(從高地址向低地址方向處理字串),清除該標記則使得串指令自動遞增,
STD以及CLD指令分別用于設定以及清除DF標志,
認真是一種態度更是一種責任
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/250681.html
標籤:其他
上一篇:2020-1-18學習總結
下一篇:編程四年,還是技不如人
