每个应用程序(进程)都有自己独立的4GB内存空间,但是这个内存不是物理内存,只是假的内存
内存地址:
内存太大没办法起名字,所以只能用编号,当我们想向内存中存储数据,或者从内存中读取数据时,必须用到这个编号,就像写信必须要写收信人地址一样。
这个编号又称为内存地址(32位0x0000 0000,前面的0可以省略),每个地址代表一块内存(1byte=8bit)
正是因为内存地址是32位,所以最多有 0xFFFF FFFF+1(因为还要包括0x0000 0000)块内存,即2^32byte==4GB。
- 立即数到内存
- MOV BYTE(限定内存段宽度为1byte) PTR DS:[037FD60](内存地址),1
- MOV DWORD(宽度为4字节的内存段) PTR DS:[0037FD60],0X12345678//虽然一个地址代表内存块(1字节),但是当存入4个字节时,就会向以其为首地址的4个内存段存入该值。
- 寄存器到内存
- MOV DWORD PTR DS:[39D004],EAX 当我们使用mov指令移动数据的时候,两边的数据宽度必须一致。
- 内存到寄存器
- MOV eax,DWORD PTR DS:[39D004]
内存地址的5种形式:
形式1:【立即数】
读取内存的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
向内存中写入数据
MOV DWORD PTR DS:[0x13FFC4],EAX
形式2;【reg】reg代表八个32位通用寄存器中任意一个
假设:EAX 0x13FFC4
MOV DWORD PTR DS:[EAX],12345678
形式3:[reg+立即数]
mov eax,dword ptr ds:[ECX+4]//ECX所储存的值+4即为内存编号
形式4:【reg+reg*1/2/4/8】
形式5:【reg+reg*1/2/4/8+立即数】
小端存储模式(80x86上绝大多数应用都是小端存储模式)
大端模式:数据高位在低位,数据低位在高位
小端模式:数据低位在低位,数据低位在低位
例如:mov word ptr ds:[0x0000 0000],0x1A2C 先存低位的2C再存高位的1A
2C(数据低位) | 0x0000 0000(内存低位) |
1A | 0x0000 0001 |
0x0000 0002 | |
0x0000 0003 | |
0xFFFF FFFF(内存高位) |
再例如:mov byte ds:[0x0000 0000],0x1A2C3E4F //只把4F存进去了
2.DTDEBUG内存窗口的使用
db 002AFFD8 以一个字节一个字节的方式来查看以002AFFD8为首地址的内存段
dw 002AFFD8 以两个字节两个字节的方式来查看以002AFFD8为首地址的内存段
dd 002AFFD8 以4个字节4个字节的方式来查看以002AFFD8为首地址的内存段
常用汇编指令
mov指令
1、MOV r/m8,r8 r 通用寄存器
2、MOV r/m16,r16 m 代表内存
3、MOV r/m32,r32 imm 代表立即数
4、MOV r8,r/m8 r8 代表8位通用寄存器
5、MOV r16,r/m16 m8 代表8位内存
6、MOV r32,r/m32 imm8 代表8位立即数
7、MOV r8, imm8 byte 字节
8、MOV r16, imm16 word 字
9、MOV r32, imm32 dword 双字
ADD指令
ADD AL, imm8 //al=al+imm8;
ADD AX, imm16
ADD EAX, imm32
ADD r/m8, imm8
ADD r/m16,imm16
ADD r/m32,imm32
ADD r/m16, imm8
ADD r/m32, imm8
ADD r/m8, r8
ADD r/m16, r16
ADD r/m32, r32
ADD r8, r/m8
ADD r16, r/m16
ADD r32, r/m32
SUB指令//减法运算
SUB AL, imm8
SUB AX, imm16
SUB EAX, imm32
SUB r/m8, imm8
SUB r/m16,imm16
SUB r/m32,imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32
AND指令//与运算
AND AL, imm8
AND AX, imm16
AND EAX, imm32
AND r/m8, imm8
AND r/m16,imm16
AND r/m32,imm32
AND r/m16, imm8
AND r/m32, imm8
AND r/m8, r8
AND r/m16, r16
AND r/m32, r32
AND r8, r/m8
AND r16, r/m16
AND r32, r/m32
OR指令://或运算
OR AL, imm8
OR AX, imm16
OR EAX, imm32
OR r/m8, imm8
OR r/m16,imm16
OR r/m32,imm32
OR r/m16, imm8
OR r/m32, imm8
OR r/m8, r8
OR r/m16, r16
OR r/m32, r32
OR r8, r/m8
OR r16, r/m16
OR r32, r/m32
XOR指令://异或运算
XOR AL, imm8
XOR AX, imm16
XOR EAX, imm32
XOR r/m8, imm8
XOR r/m16,imm16
XOR r/m32,imm32
XOR r/m16, imm8
XOR r/m32, imm8
XOR r/m8, r8
XOR r/m16, r16
XOR r/m32, r32
XOR r8, r/m8
XOR r16, r/m16
XOR r32, r/m32
NOT指令:非指令
NOT r/m8
NOT r/m16
NOT r/m32
MOVS指令:移动数据,可以从内存到内存移动数据
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]//EDI和ESI这两个容器是固定用法,分别储存了两个地址,简写为:MOVSB
MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] 简写为:MOVSW
MOVS DWORD PTR ES:[EDI],WORD PTR DS:[ESI] 简写为:MOVSD
例如:
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]//这个指令每执行一次,EDI和ESI内所存储的地址就会自动加1