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架构的为大端模式
老铁们觉得有用的话记得给个赞哦!!!我是航行的土豆!!