存儲(chǔ)cpu中的數(shù)據(jù)
32位通用寄存器
32位 |
16位 |
8位 |
EAX |
AX |
AL |
ECX |
CX |
CL |
EDX |
DX |
DL |
EBX |
BX |
BL |
ESP |
SP |
AH |
EBP |
BP |
CH |
ESI |
SI |
DH |
EDI |
DI |
BH |
8位寄存器在16位寄存器中,而16位寄存器在32位寄存器中。
簡(jiǎn)單來(lái)說(shuō)
32位寄存器就是一整個(gè)
16位寄存器就是32的一半 15-0這部分
8位寄存器分高位和低位,分別代表15-8 7-0,如下圖
?
做個(gè)實(shí)驗(yàn)就明白了
將32位寄存器全部寫(xiě)滿數(shù)據(jù)
?
對(duì)16位寄存器調(diào)試
可以看到更改的數(shù)據(jù)是后面四個(gè)
?
對(duì)8位高低寄存器調(diào)試,可以看到ah是在eax寄存器的后34位改變的,al是后兩位改變的
?
?
od添加兩個(gè)指令
?
f8執(zhí)行,eax的值變成了1 又把eax的值給了edx
?
內(nèi)存
寫(xiě)立即數(shù)到內(nèi)存
- ?
- ?
- ?
mov byte ptr ds:[內(nèi)存窗口的已申請(qǐng)的16進(jìn)制],1
byte < word < dword 字節(jié)大小
mov byte ptr ds:[0019FB90],20
?
寫(xiě)寄存器到內(nèi)存
- ?
mov byte ptr ds:[0019FB90],eax
?
讀內(nèi)存到寄存器
- ?
mov eax,byte ptr ds:[0019FB90]
?
內(nèi)存地址的五種表示方式
形式1
- ?
立即數(shù) 0019FB90
?
形式2
- ?
[reg] 代表任意寄存器
?
形式3
- ?
[reg+立即數(shù)]
?
形式4
- ?
[reg+reg*{1,2,4,8}]
?
形式5
- ?
[reg+reg*{1,2,4,8}+立即數(shù)]
?
數(shù)據(jù)的存儲(chǔ)模式
?
- ?
- ?
大段模式:數(shù)據(jù)高位在低位,數(shù)據(jù)地位在高位
小段模式:數(shù)據(jù)低位在低位,數(shù)據(jù)高位在高位
?
?
- ?
- ?
- ?
- ?
- ?
db 內(nèi)存地址 查看一個(gè)字節(jié)
dw 內(nèi)存地址 查看兩個(gè)字節(jié)
dd 內(nèi)存地址 查看四個(gè)字節(jié)
?
??端的使?場(chǎng)景
1、Intel的80×86系列芯?使??端存儲(chǔ)模式
2、ARM芯?默認(rèn)采??端,但可以切換為?端
3、MIPS芯?采??端,但可以在??端之間切換
4、在?絡(luò)上傳輸?shù)臄?shù)據(jù)普遍采?的都是?端
?
0x11223344 11是高位 44是低位
在內(nèi)存地址中 90<93內(nèi)存地址,所以是小段模式
0019FF90 44
0019FF91 33
0019FF92 22
0019FF93 11
?
mov 移動(dòng)數(shù)據(jù)
?
- ?
- ?
mov eax,1 將1存儲(chǔ)到eax中
mov eax,edx 將edx的值存儲(chǔ)到eax
?
add 數(shù)據(jù)相加
- ?
add eax,1 eax加1結(jié)果給eax
?
?
sub 數(shù)據(jù)相減
- ?
sub eax,1 eax減1結(jié)果給eax
?
?
and 作用按位與運(yùn)算
按位與
作用:只將某一位變成0,而其他位保持不變
使用:誰(shuí)要變0,誰(shuí)就和0與
and就是與運(yùn)算,兩個(gè)數(shù)按二進(jìn)制位相與,全1為1,有0為0,常用于把低位清零
or 按位或運(yùn)算
or eax,edx
按位或
作用:只將某一位變成1,而其他位保持不變
使用:誰(shuí)要變1,誰(shuí)就和1或
xor 異或運(yùn)算 一樣為0 不一樣為1
- ?
xor eax,ecx
?
not 異或運(yùn)算 一樣為1 不一樣為0
- ?
not eax,ecx
?
movs 移動(dòng)數(shù)據(jù),內(nèi)存-內(nèi)存
?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
movs byte ptr es:[EDI],byte ptr ds:[ESI]
movs word ptr es:[EDI],word ptr ds:[ESI]
movs dword ptr es:[EDI],dword ptr ds:[ESI]
簡(jiǎn)寫(xiě)
movsb
movsw
movsd
?
EFL 標(biāo)志寄存器
DF的值 由第十位決定
為0時(shí),則EDI ESI +1 +2 +4
為1時(shí),則EDI ESI -1 -2 -4
?
stos指令 將al/ax/eax的值存儲(chǔ)到edi指定的內(nèi)存單元
?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
stos byte prt es:[EDI]
stos word prt es:[EDI]
stos dword prt es:[EDI]
簡(jiǎn)寫(xiě)
stosb
stosw
stosd
?
rep指令,按計(jì)數(shù)寄存器ECX中指定的次數(shù)重復(fù)執(zhí)行字符串指令
?
- ?
- ?
- ?
- ?
mov ecx,10
rep movsd
rep stosd
?
堆棧
ESP棧指針寄存器
push指令 向堆棧壓入數(shù)據(jù),修改斬頂指針ESP寄存器
相當(dāng)于mov sub -4
?
- ?
- ?
- ?
push 3
push eax
push dword prt ds:[18FFA4]
?
pop指令 將斬頂數(shù)據(jù)存儲(chǔ)到寄存器,修改棧頂ESP寄存器
相當(dāng)于mov add +4
?
- ?
- ?
pop ecx
pop 3
修改EIP指令 下一次要執(zhí)行的指令
jmp指令 跳轉(zhuǎn)
?
- ?
- ?
- ?
jmp 004F11
jmp 10
jmp eax
?
call指令
修改EIP的值
call指令結(jié)束后,下一行地址存到堆棧中
同時(shí)ESP的值 -4
?
- ?
- ?
call 004F11
call eax
?
ret指令
?
- ?
- ?
把當(dāng)前棧頂?shù)闹捣诺紼IP,ESP +4
ret
?
函數(shù)
指令的集合
函數(shù)的調(diào)用
jmp 或 call
小案例 兩數(shù)相加
- ?
- ?
- ?
- ?
- ?
- ?
- ?
001 mov ecx,1
002 mov edx,2
003 call 009
008 add ecx,edx
009 mov eax,ecx
010 ret
?
堆棧平衡
如果要返回父程序,則當(dāng)我們?cè)诙褩V羞M(jìn)行堆棧的操作的時(shí)候,一定要保證在ret指令之前,ESP指向的是我們壓入棧中的地址。
如果通過(guò)堆棧傳遞參數(shù) 了,那么在函數(shù)執(zhí)行完畢后,要平衡參數(shù)導(dǎo)致的堆棧變化。
ESP尋址
?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
001 push 1
002 push 2
003 call 007
004 add esp,8
007 mov eax,dword prt ss:[esp+4]
008 mov eax,dword prt ss:[esp+8]
009 ret
?
EBP尋址
開(kāi)辟新的內(nèi)存空間 esp ebp整體移動(dòng),等函數(shù)調(diào)用結(jié)束在回到原位
?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
001 push 1
002 push 2
003 call 007
004 add esp,8
007 push ebp
008 mov ebp,esp
009 sub esp,10
010 mov eax,dword ptr ss:[ebp+8]
011 mov eax,dword ptr ss:[esp+C]
012 mov esp,ebp
013 pop ebp
014 ret
?
jcc指令
標(biāo)志寄存器
?CF 第0位,表示無(wú)符號(hào)數(shù)運(yùn)算的溢出狀態(tài),溢出為1,反之為0
溢出了 cf為1
?
- ?
- ?
mov al,0xFE
add al,2
?
PF 如果結(jié)果的最低有效字節(jié)包含偶數(shù)個(gè)1位,則為1,反之為0
?
- ?
- ?
mov al,0xce
add al,0
?
AF 如果算數(shù)操作在結(jié)果的第三位發(fā)生進(jìn)位或借位則將該標(biāo)志置1,否則清零
?
ZF 若結(jié)果為0,則為1,反之為0
- ?
- ?
- ?
- ?
- ?
- ?
mov eax,100
mov ecx,100
cmp eax,ecx
cmp與sub類(lèi)似,但想減的結(jié)果并不保存到第一個(gè)操作數(shù)中
test eax,ecx
?
?
SF 該標(biāo)志被設(shè)置為有符號(hào)整型的最高有效位(0 指示結(jié)果為正,反之則為負(fù))
?
- ?
- ?
- ?
- ?
- ?
mov al,0x7F
add al,2
mov al,0xFE
add al,2
?
OF 反映有符號(hào)數(shù)加減運(yùn)算所得結(jié)果是否溢出
如果無(wú)符號(hào)運(yùn)算,溢出看cf位
如果有符號(hào)運(yùn)算,溢出看of位
- ?
- ?
mov al,0x7F
add al,2
?
JCC指令 |
中文含義 |
檢查符號(hào)位 |
JZ/JE |
若為0則跳轉(zhuǎn); |
ZF=1 |
? |
若相等則跳轉(zhuǎn) |
ZF=1 |
JNZ/JNE |
若不為0則跳轉(zhuǎn); |
ZF=0 |
? |
若不相等則跳轉(zhuǎn) |
ZF=0 |
JS |
若為負(fù)則跳轉(zhuǎn) |
SF=1 |
JNS |
若為正則跳轉(zhuǎn) |
SF=0 |
JP/JPE |
若1出現(xiàn)次數(shù)為偶數(shù)則跳轉(zhuǎn) |
PF=1 |
JNP/JPO |
若1出現(xiàn)次數(shù)為奇數(shù)則跳轉(zhuǎn) |
PF=0 |
JO |
若溢出則跳轉(zhuǎn) |
OF=1 |
JNO |
若無(wú)溢出則跳轉(zhuǎn) |
OF=0 |
JC/JB/JNAE |
若進(jìn)位則跳轉(zhuǎn); |
CF=1 |
? |
若低于則跳轉(zhuǎn); |
CF=1 |
? |
若不高于等于則跳轉(zhuǎn) |
CF=1 |
JNC/JNB/JAE |
若無(wú)進(jìn)位則跳轉(zhuǎn); |
CF=0 |
? |
若不低于則跳轉(zhuǎn); |
CF=0 |
? |
若高于等于則跳轉(zhuǎn); |
CF=0 |
JBE/JNA |
若低于等于則跳轉(zhuǎn); |
ZF=1或CF=1 |
? |
若不高于則跳轉(zhuǎn) |
ZF=1或CF=1 |
JNBE/JA |
若不低于等于則跳轉(zhuǎn); |
ZF=0而且CF=0 |
? |
若高于則跳轉(zhuǎn) |
ZF=0而且CF=0 |
JL/JNGE |
若小于則跳轉(zhuǎn); |
SF != OF |
? |
若不大于等于則跳轉(zhuǎn) |
SF != OF |
JNL/JGE |
若不小于則跳轉(zhuǎn); |
SF = OF |
? |
若大于等于則跳轉(zhuǎn); |
SF = OF |
JLE/JNG |
若小于等于則跳轉(zhuǎn); |
ZF != OF 或 ZF=1 |
? |
若不大于則跳轉(zhuǎn) |
ZF != OF 或 ZF=1 |
JNLE/JG |
若不小于等于則跳轉(zhuǎn); |
SF=0F 且 ZF=0 |
? |
若大于則跳轉(zhuǎn) |
SF=0F 且 ZF=0 |
?
評(píng)論
查看更多