小编Jas*_*ill的帖子

程序启动前堆栈上有什么?

我正在学习高级汇编语言,并正在玩堆栈以更好地理解一切.

我注意到在下面的程序中,我可以弹出堆栈的内容,而不会在程序崩溃之前将任何东西压到它上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位.

assembly stack

6
推荐指数
1
解决办法
312
查看次数

程序如何分配大量内存?

我有3个关于内存分配的问题,我认为最好把它放在一个问题而不是3个问题上.

  1. 根据我的理解分配内存,它在堆上分配,只有16mb.如何使用视频游戏或现代浏览器等程序使用超过1GB的程序?

  2. 由于显然可以使用这么多内存,为什么不能在开始时分配它?我发现我可以用高级汇编语言分配的最多大约是100MB.这远远超过16MB,远远低于我的3,所以这个限制来自何处?

  3. 为什么首先分配内存,而不是分配变量并让编译器/系统处理它?

memory assembly memory-management

1
推荐指数
1
解决办法
383
查看次数

为什么没有设置进位标志?

我有一个简单的高级装配程序,我正在学习位移和旋转的细节.我有这个简单的程序可以在一个字节中移位.

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位

x86 assembly

0
推荐指数
1
解决办法
1817
查看次数

int 0x81究竟做了什么?

x86汇编代码中的int 0x81是为寄存器空间分配一个整数,还是仅调用一个中断?

x86 assembly

0
推荐指数
1
解决办法
1105
查看次数

标签 统计

assembly ×4

x86 ×2

memory ×1

memory-management ×1

stack ×1