内存读写,堆栈2015.1.16

一、内存

1、寄存器和内存的区别(详见第一章)

2、计量单位

3、正常情况下,32位的计算机能识别的内存最多是4g,但是可以通过打补丁增加寻址范围来识别更多

4、内存读写(一定要指定内存宽度byte八位    word十六位   dword三十二位)

(1)如:将FFFF十六位的数写到内存地址为0x12345678中,是内存编号要加[],因为是十六位要在前面+word(因为内存很大要加自己的宽度,而寄存器是多了会自动删掉),还要加ptr(告诉后面的是一个地址)和DS:

(2)

 二、堆栈

 1、寻址

寻址公式详见第一章

lea指令:取地址

2、结构图

 3.(1)压入数据

 

 (2)读取数据

 

(3)弹出数据

 

 4、push和pop

 

(1)push不是永远减4,①push立即数的时候无论立即数多大都只减4

②push寄存器,不能push8位,push32位的是减4(如push EAX)

 ③push内存,也不能push8位的,减的数量和后面跟的容器宽度是一样的

(32位四字节push dword ptr ds:[0x0012FFDA],结果是减4将0012FFDA中的值直接push到0012FFD6中)

(双字节push word ptr ds:[0x0012FFDA],结果是减2将0012FFDA中的值直接push到0012FFD8中)

(2)pop

①pop容器 (pop r16或pop r32):(pop一个16位的容器 pop ax,直接加2)

②pop内存(pop m16或pop m32):加的数量和后面宽度是一样的

5、pushad和popad(保存堆栈)

(1)pushad;先把ESP,EBP之外的改了,ESP、EBP不能改值,因为这里面的内存是操作系统为我们的程序分的,改了对象就丢了

执行pushad后,把八个通用寄存器里面的值存到内存(堆栈)里面去了,之后就可以随意使用计算机,想恢复原样直接popad

(2)popad

 

posted @ 2024-06-23 11:47  Auriry  阅读(5)  评论(0编辑  收藏  举报