我正在学习高级汇编语言,并正在玩堆栈以更好地理解一切.
我注意到在下面的程序中,我可以弹出堆栈的内容,而不会在程序崩溃之前将任何东西压到它上37次.
ike1: uns32 := 1;
begin test1;
while (ike1 < 38) do
pop(eax);
stdout.put(ike1, nl);
stdout.put("ESP: ", esp, nl);
stdout.put("EAX:", eax, nl, nl);
add(1, ike1);
endwhile;
end test1;
Run Code Online (Sandbox Code Playgroud)
每次将堆栈弹出到EAX中,并且EAX的输出每次都显示随机数据.
我首先不明白这是怎么可能的,因为我认为每个程序都被分成了自己的私有内存空间?
无论如何,我正在弹出堆栈的数据......这会是什么,它会影响任何其他正在运行的程序吗?
我的操作系统是Windows 7 64位.
我有3个关于内存分配的问题,我认为最好把它放在一个问题而不是3个问题上.
根据我的理解分配内存,它在堆上分配,只有16mb.如何使用视频游戏或现代浏览器等程序使用超过1GB的程序?
由于显然可以使用这么多内存,为什么不能在开始时分配它?我发现我可以用高级汇编语言分配的最多大约是100MB.这远远超过16MB,远远低于我的3,所以这个限制来自何处?
为什么首先分配内存,而不是分配变量并让编译器/系统处理它?
我有一个简单的高级装配程序,我正在学习位移和旋转的细节.我有这个简单的程序可以在一个字节中移位.
static
var: int8 := 127;
begin test1;
stdout.put(var, nl);
shl(1, var);
stdout.put(var, nl);
if (@C) then stdout.put("carry set"); endif;
end test1;
Run Code Online (Sandbox Code Playgroud)
当字节设置为127时,它应该是01111111.
当然,通过向左移动一次,应该提高进位标志,因为最后一位保留用于签名?
然而,这似乎不会发生,实际上所有字节都向左移动一次,因此字节现在是11111110或-2.
如果每次都发生这种情况,那么什么条件会导致进位标志被设置?
平台赢得7 64位