栈和寄存器
在编译时,编译器将局部变量入栈,但是我有个疑问就是:
1,这些在栈中的变量要被使用时,是否必须得先pop到寄存器中?
2,如果有空闲的寄存器,就不停的pop,直到所有寄存器被利用,避免浪费?
3,当所有的能利用的寄存器都被利用后,但此时仍然有局部变量还在栈中,没有分配到寄存器,会怎么处理?
请大牛们赐教
[解决办法]
1.push才是入栈,保存寄存器的值,pop是出栈,将值返回给寄存器...栈也是有内存地址的,可修改的,如果要对一个数值进行修改,修改好后再出栈就得到值了
2.不一定的,看程序怎样执行,执行时需要那些寄存器...
3.寄存器全被利用后,要访问多的东西一般是用EBP+偏移来访问的
[解决办法]
10: int a;11: int b;12:13: a = 1;0040D798 mov dword ptr [ebp-4],1 ; 赋值是ebp直接操作栈的14: b = 2;0040D79F mov dword ptr [ebp-8],2
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!