1.1.進制
進制的定義:
八進制的定義:由八個符號組成,分別是01234567逢八進一,
十進制的定義:由十個符號組成,分別是0123456789逢十進一,
N進制的定義:由N個符號組成,逢N進一,
1.2、進制的運算
八進制運算
2+3=5
2*3=6
4+5=11
4*5=24
277+333= 632
276*54= 162
237-54= 20250
234/4= 47
#八進制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27
八進制加法表
2+3=5
2*3=6
4+5=11
4*5=24
277+333= 632
276*54= 162
237-54= 20250
234/4= 47
#八進制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27
八進制加法表

八進制乘法表

1.3.二進制簡寫形式
計算機為什么使用二進制
計算機是需要用電的,電路只有兩種狀態: 1真(通電) 0假(未通電)
計算機中存盤的任何檔案、接收的任何指令都是由0和1組成的
二進制與十六進制
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0 1 2 3 4 5 6 7 8 9 A B C D E F
1.4.資料寬度
資料寬度
數學上的數字,是沒有大小限制的,可以無限的大,但在計算機中,由于受硬體的制約,資料都是有長度限制的(我們稱為資料寬度),超過最大寬度的資料會被丟棄,
計算機中常見的資料寬度:
1)位(BIT) 1位
2)位元組(Byte) 8位
3)字(Word) 16位
4)雙字(Doubleword) 32位
存盤范圍:
位元組(Byte): 0 ~ 0xFF
字(Word): 0 ~ 0xFFFF
雙字:0~ 0xFFFFFFFF
如果要存盤的資料超過最大寬度,那么多余的資料將被丟棄!
1.5.無符號數有符號數
無符號數的編碼規則
10011010
十六進制:0x9A
十進制:154
有符號數的編碼規則
正數編碼規則(第一位是0),如果是正數就和無符號數編碼規則一樣
00011010
負數編碼規則(第一位是1)
10011010
1.6.原碼反碼補碼
有符號數的編碼規則
原碼:最高位為符號位,其余各位為數值本身的絕對值
反碼:
正數:反碼與原碼相同
負數:符號位為1,其余位對原碼取反
補碼:
正數:補碼與原碼相同
負數:符號位為1,其余位對原碼取反加1
-1
原碼:10000001
反碼:11111110
補碼:11111111 (負數在計算機里面是采用補碼的形勢存盤的)
-7
原碼:10000111
反碼:11111000
補碼:11111001 (負數在計算機里面是采用補碼的形勢存盤的)
1.7.計算機不會做加法






1.8.位運算之加減乘除
4+5=?的運算程序

4-5=?的運算程序

1.9.匯編環境安裝
下載DTdebug工具,打開后設定UDD和plugin的路勁,Options-->Appearance


1.10.通用暫存器
1、暫存器
存盤資料:
CPU>記憶體>硬碟
32位CPU: 8 16 32
64位CPU: 8 16 32 64
2、通用暫存器
32位通用暫存器:
EAX
ESP
ECX
EBP
EDX
ESI
EBX
EDI
3、MOV指令
<1> 立即數到記憶體
<2>暫存器到記憶體
<3>記憶體到暫存器
按F8單步運行

4.通用暫存器

1.11.記憶體

2、記憶體地址
<1>記憶體太大沒法起名字,所以只能用編號,當我們想向記憶體中存盤資料,或者從記憶體中讀取資料時,必須用到這個編號,就像寫信必須要寫收信人地址一樣,
<2>這個編號又稱為記憶體地址(32位,前面0可以省略),
3、往記憶體中寫入值
MOV DWORD PTR DS:[19FF90],12345678
# DWORD表示四個位元組長度
#PTR DS:[19FF90]表示記憶體地址
1.12.記憶體地址的五種形式
1、形式一: [立即數]
讀取記憶體的值:
MOV EAX,DWORD PTR DS:[Ox13FFC4]
向記憶體中寫入資料:
MOV DWORD PTR DS:[0x13FFC4],EAX
2、形式二: [reg] reg代表暫存器可以是8個通用暫存器中的任意一個
讀取記憶體的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]
向記憶體中寫入資料:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX],0x87654321
3、形式三: [reg+立即數]
讀取記憶體的值:
MOV ECX,0x1 3FFD0
MOV EAX,DWORD PTR DS:[ECX+4]
向記憶體中寫入資料:
MOV EDX,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+ECX4]
向記憶體中寫入資料:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX4],87654321
5、形式五: [reg+reg*{1 ,2,4,8}+立即數]
讀取記憶體的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX4+4]
向記憶體中寫入資料:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX4+4],87654321
1.13.存盤模式

2、DTDEBUG記憶體視窗的使用
<1>分別以位元組/字/雙字形式來查看記憶體(db dw dd)

<2>向記憶體中寫入四個位元組的資料,并觀察存盤形式(大端存盤/小端存盤)

1.14.常用匯編指令
1、MOV指令
指令格式:
1、MOV r/m8,r8 r通用暫存器
2、MOV r/m16,r16 m代表記憶體
3、MOV r/m32,r32 ; imm代表立即數
4、MOVr8,r/m8 r8代表8位通用暫存器
5、MOV r16,r/m16 m8代表8位記憶體
6、MOV r32,r/m32 ; imm8代表8位立即數
7、MOV r8, imm8
8、MOV r16, imm16
9、MOV r32, imm32
2、ADD指令
指令格式:
ADD r/m8, imm8
ADD r/m16, imm16
ADD r/m32,imm32
ADD r/m16, imm8
ADD r/m32, imm8
ADD r/m8, r8
ADD r/m16, r16
ADD r/m32, r32
ADD r8, r/m8
ADD r16, r/m16
ADD r32, r/m32
3、SUB指令
指令格式:
SUB r/m8, imm8
SUB r/m1 6,imm16
SUB r/m32,imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32
4、AND指令
AND r/m8, imm8
AND r/m16,imm16
AND r/m32,imm32
AND r/m16, imm8
AND r/m32, imm8
AND r/m8, r8
AND r/m16, r16
AND r/m32, r32
AND r8, r/m8
AND r16, r/m16
AND r32, r/m32
5、OR指令
OR r/m8, imm8
OR r/m16 ,imm16
OR r/m32,imm32
OR r/m16, imm8
OR r/m32, imm8
OR r/m8, r8
OR r/m16, r16
OR r/m32, r32
OR r8, r/m8
OR r16, r/m16
OR r32, r/m32
6、XOR指令
XOR r/m8, imm8
XOR r/m16,imm16
XOR r/m32 ,imm32
XOR r/m16, imm8
XOR r/m32, imm8
XOR r/m8, r8
XOR r/m16, r16
XOR r/m32, r32
XOR r8, r/m8
XOR r16, r/m16
XOR r32, r/m32
7、NOT指令
NOT r/m8
NOT r/m16
NOT r/m32
1.15.記憶體復制指令
1、MOVS指令:移動資料記憶體-記憶體
BYTENWORD/DWORD
MOVS BYTE PTR ES:[EDJ,BYTE PTR DS:[ESI] 簡寫為: MOVSB
MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] 簡寫為: MOVSW
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 簡寫為: MOVSD
例子: .
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
觀察EDI的值
修改標志暫存器中D位的值,然后在執行下面的指令:
MOV EDI,12FFD8
MOV ESI,12FFD0MOVS 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 觀察EDI的值
MOV EDI, 12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
修改標志暫存器中D位的值,然后在執行下面的指令:
MOV EAX, 12345678 觀察EDI的值
MOV EDI, 12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
3、REP指令: 按計數暫存器(ECX)中指定的次數重復執行字串指令
MOV ECX,10
REP MOVSD
REP STOSD
1.16.堆疊相關指令
1、什么是堆疊?
1)就是一塊記憶體,作業系統在程式啟動的時候已經分配好的,供程式執行時使用,
2)和資料結構的堆疊無關,
3)查看堆疊,
2、堆疊指標暫存器
ESP中存盤了當前的堆疊用到哪里了
3、堆疊的使用
<1>存盤資料
<2>修改堆疊頂指標
4、PUSH指令
<1>向堆疊中壓人資料
<2>修改堆疊項指標ESP暫存器
指令格式:
1、PUSH r32
2、PUSH r16
3、PUSH m16
4、PUSH m32
5、PUSH imm8/imm1 6/imm32
5、POP指令:
<1>將堆疊頂資料存盤到暫存器/記憶體
<2>修改堆疊項指標ESP暫存器
指令格式:|
1、POP r32
2、POPr16
3、POP m16
4、POP m32
1.17.修改EIP的指令
1、JMP指令:
MOV EIP,暫存器/立即數/記憶體 簡寫為 JMP暫存器/立即數/記憶體
2、CALL指令:
PUSH下一行地址
MOV EIP,立即數/暫存器/記憶體 簡寫為: CALL立即數/暫存器/記憶體
與JMP唯--的區別:
在堆疊中存盤Call指令下一-行地址
3、RET指令:
ADD ESP,4
MOV EIP,[ESP-4]
簡寫為: RET
1.18.匯編眼中的函式
1、什么是函式
函式就是一系列指令的集合,為了完成某個會重復使用的特定功能,
例子:向暫存器中賦值
2、如何執行一個函式?即函式呼叫
<1>用JMP來執行函式
<2> 用CALL來執行函式
3、 什么是引數?什么是回傳值?
例子:撰寫一個函式,能夠得到任意2個整數的值,
1.19.堆疊平衡
什么是堆疊平衡?
1)如果要回傳父程式,則當我們在堆疊中進行堆疊的操作的時候,一定要保證在RET這條指令之前,ESP指向的是我們壓入堆疊中的地址,
2)如果通過堆疊傳遞引數了,那么在函式執行完畢后,要平衡引數導致的堆疊變化,
1.20.JCC指令
1、JE, JZ 結果為零則跳轉(相等時跳轉) ZF=1
2、JNE, JNZ 結果不為零則跳轉(不相等時跳轉) ZF=0
3、JS 結果為負則跳轉 SF=1
4、JNS 結果為非負則跳轉 SF=0
5、JP, JPE 結果中1的個數為偶數則跳轉 PF=1
6、JNP, JPO 結果中1的個數為偶數則跳轉 PF=0
7、J0 結果溢位了則跳轉 0F=1
8、JNO 結果沒有溢位則跳轉 0F=0
9、JB, JNAE 小于則跳轉(無符號數) CF=1
10、JNB, JAE 大于等于則跳轉(無符號數) CF=0
11、JBE, JNA 小于等于則跳轉(無符號數) CF=1 or ZF=1
12、JNBE, JA 太于則跣轉(無符號數) CF=0 and ZF=0中
13、JL, JNGE 小于則跳轉(有符號數) SF≠OF
14、JN, JGE 大于等于則跳轉(有符號數) SF=OF
15、JLE, JNG 小于等于則跳轉(有符號數) ZF=1 or SF≠0F
16、JNLE, JG 因于則來轉(有符號數) ZF=0 and SF=OF
1、標志暫存器:EFLAGS

2、CF (bit 0) [Carry fiag]
若算術操作產生的結果在最高有效位(most-significant bit)發生進位或借位則將其置1,反之清零,
這個標志通常用來指示無符號整型運算的溢位狀態,
例:
MOV AL,0xFE MOV AL,0x7F
ADD AL,2 或者 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,OCE
ADDAL,0
4、AF(bit 4) [Adjust Flag]
如果算術操作在結果的第3位發生進位或借位則將該標志置1,否則清零,
這個標志在BCD(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
(TEST指令相當于AND指令,但是與的結果并不保存到第-一個運算元中)
6、SF(bit 7) [Sign flag]
該標志被設定為有符號整型的最高有效位,
(0指示結果為正,反之則為負)
例子:
MOV AL ,0x7F MOV AL ,0xFE
ADD AL,2 ADDAL,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/houduan/274334.html
標籤:C++
上一篇:Maven打包出現這個
