能力值:
(RANK:570 )
|
-
-
2 楼
栈也可以理解为内存读写。
你同样可以使用MOV指令来对堆栈中的数据进行读写操作
差别在于栈操作的CPU指令是经过特殊优化的。
AMD技术手册里面有个附录,有所有指令运行所需要的时钟周期
mov reg32,mem32和mov mem32,reg32都需要3个时钟周期
pushad/popad都需要6个时钟周期
movq mmreg,mem64和movq mem64,mmreg都需要2个时钟周期(这是MMX指令,针对大量数据处理而优化的)
好了,现在来说说差别。
pushad将EAX ECX EDX EBX ESP EBP ESI EDI全部写进堆栈,一共是256位的数据,只需要6个时钟周期
用MOV MEM32,REG32向内存中写256位的数据需要24个时钟周期
如果用MMX指令MOVQ,则需要8个始终周期
性能上的差别,这就是为什么使用堆栈保存一些局部变量而不使用内存(一般用作保存全局变量)的原因了。
只要修改ESP,那么对应的内存便可以认为是堆栈了。当然被用作堆栈的内存需要设置相应的页面属性
|
能力值:
( LV13,RANK:970 )
|
-
-
3 楼
栈比寄存器慢,但比一般的内存地址快一些
|
|
|