数据存储
数据存储的时候是从高到低位顺序存储的. 而在 数据窗口显示顺序是 低位到高位存储. 也就是,一个数字: 12345678 1 就是高位,8就是低位. 那么在寄存器中显示的就是
而在 数据窗口显示的就是倒过来的
87 65 43 21
这么显示
demo
问: 0012FFD8 对应的数据是 0012FFC8
那么输出 FF ,12 ,00 对应的地址是多少
从前面可以知道, 堆栈窗口存储的数据是逆序存储
那么:
地址 | 数据 |
---|---|
00 | |
12 | |
FF | |
D8 | 0012FFC8 |
D8 对应 C8. 那么, 从 D8 开始,在 +一:
D9 : FF
DA : 12
DB : 00
C8 对应的是D8. 是逆序存储的话, C8应该是在高位. 也就是 0012FFD8 = D8FF1200 : C8FF1200. 这时候从D8开始往下增加. 就是 D9,DA,DB
寻址公式
之前给了几个公式. 可以用来表示地址 .操作数据
一: 立即数
mov eax,dword prt ds:[0x123456]
我们还可以获取内存编号
lea eax,dword ptr ds:[0x13ffc4]
lea eax,dword ptr ds:[0x13ffc8]
地址 13ffc4 中 有个数据,这个数据所在的内存编号.就是 13ffc4. 我们获取的就是这个地址值
堆栈
window 地址 00000000 是起始地址,较大的地址 window 开辟堆栈是从大往小开辟的. 我们在使用的时候, 使用 EDX 和 EBX + - 来获得堆栈内的数据地址.练习
通过操纵栈顶栈底,获得堆栈中的数据
存入数据
存入数据,提升栈顶. 栈顶 - 4. 提升一个dword字节的空间
取出数据
取出数据,栈顶 + 4. 释放dword 字节的空间
pop,push
pop 和push 的原理就是 mov 之类的移动指令
push 0x12345678: 将 0x12345678 入栈. 之后 在将 此数据所在内存单元编号存入 esp 中
pop eax: 就是将栈顶的值出栈,之后将 栈顶的值赋给 eax寄存器. 并将 esp的值 + 4即可.
esp + 4: 栈顶减少一个内存单元.
还有 pop 的公式 你能想出来吗