内存读写,堆栈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