x86寄存器篇
通用寄存器:
32位 | 16位 | 8位 |
---|---|---|
EAX | AX | AL |
ECX | CX | CL |
EDX | DX | DL |
EBX | EX | BL |
ESP | SP | AH |
EBP | BP | CH |
ESI | SI | DH |
EDI | DI | BH |
注意:
1、AX存2個字節,正好就是EAX的低兩個字節;AL存1個字節,正好就是EAX的低字節,同樣也是AX的低字節;bcd類似;
2、這裏ESP、EBP、ESI、EDI比較特殊只有低兩個字節的寄存器,並沒有一個字節的寄存器
MOV指令:
-
立即數到寄存器
例:mov eax , 1 -
寄存器到寄存器
例: mov eax , ecx -
寄存器到內存
例:
mov byte ptr ds:[合理地址] , al (單字節)
mov word ptr ds:[合理地址] , ax (雙字節)
mov dword ptr ds:[合理地址] , eax (雙字) -
內存到寄存器
例:
mov bl , byte ptr ds:[合理地址] (單字節)
mov bx , word ptr ds:[合理地址] (雙字節)
mov ebx , dword ptr ds:[合理地址] (雙字) -
立即數到內存
例: mov word ptr ds:[合理地址] , 0x1122
內存地址幾種表現形式:
1、立即數形式
例:
mov eax , 0x113344 讀內存
mov 0x113355 , edx 寫內存
2、寄存器形式
例:
mov eax,dword ptr:ds [ edx ]
mov dword ptr:ds [ eax ] , ecx
3、寄存器+立即數形式
例:
mov eax,dword ptr:ds [ edx + 4 ]
mov dword ptr:ds [ eax - 4 ] , ecx
4、寄存器+寄存器x{1,2,4,8}形式
例:
mov eax,dword ptr:ds [ edx + ecx*4 ]
mov dword ptr:ds [eax - edx *2] , ecx
5、寄存器+寄存器x{1,2,4,8}+立即數形式
例:
mov eax,dword ptr:ds [ edx + ecx*4 +4]
mov dword ptr:ds [eax - edx *2 - 4 ] , ecx
存儲模式:
首先我們都知道32位系統下,每個進程會有4GB的虛擬內存空間,假設如下排列:
接着我們在看一下下面幾條指令:
<1> mov byte ptr ds:[0x00000000],0x20
這一條毋庸置疑,是把0x20這個一個字節立即數放到內存裏面
<2> mov byte ptr ds:[0x00000000],0x2030
那麼這個我們就會產生思考,放的是0x20,還是0x30??
<3> mov byte ptr ds:[0x00000000],0x20304050
這邊也是類似的疑問!
由此我們就可以簡單講一下大端模式和小段模式兩種計算機的存儲模式了!
兩句口訣:
1、大端模式:數據高位在低地址,數據低位在高地址
2、小端模式:數據低位在低地址,數據高位在高地址
怎麼理解呢?我們可以利用DTDebug的內存區來進行觀察:
敲入指令:
MOV WORD PTR DS:[EFFB38],2030
MOV DWORD PTR DS:[EFFB3C],20304050
很明顯我們發現數據的低字節在低地址,很明顯的小端模式!!!
注:大部分的x86架構都是小端模式,許多Arm架構的爲大端模式
老鐵們覺得有用的話記得給個贊哦!!!我是航行的土豆!!