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