汇编:堆栈参数而不是寄存器

时间:2015-12-09 22:23:34

标签: assembly parameters stack masm irvine32

我在MASM装配中遇到过一个问题。我无法理解如何使用堆栈参数而不是寄存器。

我想出了一个愚蠢的"程序"帮助我更好地理解这些概念。

如果愿意的话,编写一个程序来提示用户输入5个整数,     然后将它们显示给用户。

如果您愿意,我已经为您创建了一种模板......

mergecap

在读取数据,保存数据和发送数据的上下文中,如何使用堆栈参数代替寄存器?我的意思是通过回答我上面提出的问题可以显示的东西类型。

1 个答案:

答案 0 :(得分:1)

我从未真正使用PROTOINVOKE,但一般的想法是PROTO是一个指令(它不生成任何代码),它告诉汇编程序你有一个函数,它期望的参数数量,以及每个参数的类型,以便稍后您可以使用INVOKE来调用函数,指定内联参数,如下所示:

INVOKE GetScores scores, count

(这可能不完全准确,您可能需要说OFFSET scores,我不知道,我也无法尝试。)

汇编程序实际上会发出以下指令:

push OFFSET scores
push count
call GetScores

然后,通过在您的函数中使用PROC,您可以将这些参数简单地作为scorescount而不是[ebp + 8][ebp + 12]来访问。

在您的函数中,您可以立即将scorescount加载到寄存器中以与它们一起使用,就像您在发布的代码中一样。在循环的每次迭代中继续从esi重新加载scores将是愚蠢的。

但是,如果你编写的功能要复杂得多,那么你的寄存器就会用完,所以你必须将esi保存到scores才能使用esi来实现某些功能否则,然后从scores重新加载它。如果ReadInt函数正在使用(“腐败”)esi,则必须执行相同操作。