寄存器
电脑可以在三个地方存储数据,CPU>RAM>ROM
寄存器就是CPU内的存储器
存储格式:
32位CPU:8 16 32
64位CPU:8 16 32 64
通用寄存器
16位是32位的低位,两个8位组成一个16位。
32位 16位 8位
EAX AX AH+AL
ECX CX CH+CL
EDX DX DH+DL
EBX BX BH+BL
ESP SP
EBP BP
ESI SI
EDI DI
MOV指令
1.把数存到寄存器。例:MOV EAX,1
2.把寄存器的值存到另一寄存器。例:MOV EDX,EAX(注意是后面的值赋给前面)
内存
内存地址
每个内存地址对应1Byte,内存地址大小为32位,前面的0可以省略,表示时用十六进制。
每个应用程序都有独立的4GB空间就是这个大小,但是这并非是完全可用的,使用前需要先申请。
从0x00000000到0xFFFFFFFF
MOV指令
注意前后数据宽度一致,大于一个字节的数据是从给的编号开始,向后存储。
1.数到内存,例如:MOV BYTE PTR DS:[0018FFF0],1 注:内存空间是要被申请的才行
2.寄存器到内存,例如:MOV DWORD PTR DS:[0018FFFC],EAX 注:EAX是4个字节(DWORD),AX是2个字节(WORD),AL是1个字节(BYTE)
3.内存到寄存器,例如:MOV EAX,DWORD PTR DS:[0018FFF8]
汇编中绝大多数指令不允许从内存到内存。
内存地址的五种形式
前面MOV指令中[]的内容
1.立即数,例如:0x13FFC4
2.reg,reg为8个通用寄存器中的任意一个,例如:EAX,此时就是把EAX中的数据当做内存地址
3.reg+立即数,例如:EAX+4
4.reg+reg*{1,2,4,8},数组赋值的汇编一般是这种形式,例如:EAX+ECX*4
5.reg+reg*{1,2,4,8}+立即数,例如:EAX+ECX*4+4
数据的存储模式
大端模式:数据高位存低位,数据低位存高位
小端模式:数据高位存高位,数据低位存低位
X86大多采用小端模式存储,ARM大多采用大端模式存储
DTdebug命令
db/dw/dd xxxxxxxx
db是一个字节为单位查看,dw是两个字节为单位查看,dd是四个字节为单位查看。后跟内存地址
注意:想查看存储模式时,要用db,直接用dd看不出来