04.内存地址和堆栈

1.32位, 16位, 8位通用寄存器
2.寄存器的结构:EAX-AX-AH-AL的对应关系
3.为什么8位寄存器只能放2个十六进制的数
4.内存单元:字节 每个字节有个编号,称为内存地址
5.如何操作指定的内存:8位内存, 16位内存, 32位内存
6.数据窗口的使用、数据窗口与堆栈窗口的显示方式

EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
AX, CX, DX, BX, SP, BP, SI, DI
AL, CL, DL, BL, AH, CH, DH, BH

OD命令
以字节形式查看内存
db 0x12ffdc
以双字形式查看内存
dd 0x12ffdc

每种寻址公式分别实现内存的读、写和取内存地址
寻址公式1
[立即数]
寻址公式2
[reg]
寻址公式3
[reg+立即数]
寻址公式4
[reg+reg{1, 2, 4, 8}]
寻址公式5
[reg+reg
+立即数]

获取内存编号
LEA EAX, DWORD PTR DS:[0x13FFC4] // 等价于MOV EAX, 0x13FFC4

堆栈的优点
1.存储大量临时的数据
2.快速查找

window栈
高地址:栈底
低地址:栈顶

常用存栈顶寄存器
ESP
常用存栈底寄存器
EBP

将数据放入栈顶(压栈)
PUSH 0x12345678
PUSH r32
PUSH r16
PUSH m16
PUSH m32
PUSH imm8/imm16/imm32

将数据从栈顶取出(出栈)
POP eax
POP r32
POP r16
POP m16
POP m32
POP imm8/imm16/imm32

本节练习:
1.使用EBX存储栈底地址,EDX存储栈顶地址,连续存储5个不同的数
2.分别使用栈底加偏移、栈顶加偏移的方式读取这5个数,并存储到寄存器中
3.弹出这5个数,恢复栈顶到原来的位置
4.使用2种方式实现: push ecx
5.使用2种方式实现: pop ecx
6.使用2种方式实现: push esp
7.使用2种方式实现: pop esp

MOV EBX,53FA7C
MOV EDX,53FA7C

MOV DWORD PTR DS:[EDX],11111111
SUB EDX,4

LEA EDX,DWORD PTR DS:[EDX-4]
MOV DWORD PTR DS:[EDX+4],22222222

MOV EAX,33333333
MOV DWORD PTR DS:[EDX],EAX
LEA EDX,DWORD PTR DS:[EDX-4]

SUB EDX,4
MOV DWORD PTR DS:[EDX+4],44444444

MOV DWORD PTR DS:[EDX],55555555
SUB EDX,4

MOV EAX,DWORD PTR DS:[EBX]

MOV ECX,DWORD PTR DS:[EBX-4]

MOV ESI,DWORD PTR DS:[EDX+4]

MOV EDI,DWORD PTR DS:[EDX+8]

MOV EAX,-4
MOV EAX,DWORD PTR DS:[EBX+EAX*2]

MOV EAX,DWORD PTR DS:[EDX+4]
ADD EDX,4

MOV ECX,DWORD PTR DS:[EDX+4]
LEA EDX,DWORD PTR DS:[EDX+4]

ADD EDX,4
MOV ESI,DWORD PTR DS:[EDX]

LEA EDX,DWORD PTR DS:[EDX+4]
MOV EDI,DWORD PTR DS:[EDX]

MOV EAX,DWORD PTR DS:[EDX+4]
ADD EDX,4

PUSH/POP后栈顶移动单位
根据容器大小(2(16bit), 4(32bit)

PUSHAD
将8个通用寄存器值压入栈中
POPAD
将8个通用寄存器值从栈中恢复

OD下断点
bp MessageBoxA

函数开始执行时, 栈顶存储的是返回地址

JE
标志寄存器Z为1时跳转

JMP
无条件跳转

EFL标志寄存器

CF
0, Carry Flag进位标志寄存器, 计算结果中最高位是否进位或借位

PF
2, Parity Flag奇偶标志寄存器, 计算结果中"1"的个数奇偶性, "1"的个数为偶数值为1

AF Auxiliary Carry Flag辅助进位标志寄存器
4,

ZF
6,

SF
7,

OF
11,

posted @ 2020-05-05 14:53  ret  阅读(586)  评论(0编辑  收藏  举报