我在MASM装配中遇到过一个问题。我无法理解如何使用堆栈参数而不是寄存器。
我想出了一个愚蠢的"程序"帮助我更好地理解这些概念。
如果愿意的话,编写一个程序来提示用户输入5个整数, 然后将它们显示给用户。
如果您愿意,我已经为您创建了一种模板......
mergecap
在读取数据,保存数据和发送数据的上下文中,如何使用堆栈参数代替寄存器?我的意思是通过回答我上面提出的问题可以显示的东西类型。
答案 0 :(得分:1)
我从未真正使用PROTO
和INVOKE
,但一般的想法是PROTO
是一个指令(它不生成任何代码),它告诉汇编程序你有一个函数,它期望的参数数量,以及每个参数的类型,以便稍后您可以使用INVOKE
来调用函数,指定内联参数,如下所示:
INVOKE GetScores scores, count
(这可能不完全准确,您可能需要说OFFSET scores
,我不知道,我也无法尝试。)
汇编程序实际上会发出以下指令:
push OFFSET scores
push count
call GetScores
然后,通过在您的函数中使用PROC
,您可以将这些参数简单地作为scores
和count
而不是[ebp + 8]
和[ebp + 12]
来访问。
在您的函数中,您可以立即将scores
和count
加载到寄存器中以与它们一起使用,就像您在发布的代码中一样。在循环的每次迭代中继续从esi
重新加载scores
将是愚蠢的。
但是,如果你编写的功能要复杂得多,那么你的寄存器就会用完,所以你必须将esi
保存到scores
才能使用esi
来实现某些功能否则,然后从scores
重新加载它。如果ReadInt
函数正在使用(“腐败”)esi
,则必须执行相同操作。