Assembly 汇编编程:为什么函数参数总是内存位置?

Assembly 汇编编程:为什么函数参数总是内存位置?,assembly,x86,Assembly,X86,我是汇编编程的新手,我想知道为什么变量的地址总是被推送到堆栈而不是实际变量。例如: .text:00401270 push ebp .text:00401271 mov ebp, esp .text:00401273 sub esp, 80h .text:00401279 push offset aString1 .text:0040127E call sub_401554 为什么实际变量从未作为参数推送?并非所有“函数”参数都必须通过引用传递,但您的示例是一个字符串,它是通过引用传递

我是汇编编程的新手,我想知道为什么变量的地址总是被推送到堆栈而不是实际变量。例如:

.text:00401270 push ebp

.text:00401271 mov ebp, esp

.text:00401273 sub esp, 80h

.text:00401279 push offset aString1

.text:0040127E call sub_401554
为什么实际变量从未作为参数推送?

并非所有“函数”参数都必须通过引用传递,但您的示例是一个字符串,它是通过引用传递的,因为它的变量大小在堆栈上不合适

如何调用函数并在返回之前进行清理的具体细节取决于要与之接口的调用约定


如果调用方始终是您控制的汇编代码,您可以选择在堆栈上传递短参数,但传递指针可以让您使用更大、更复杂的数据结构,因此更可能需要手动编码的汇编优化。

您可以。但是字符串不能超过4个字符,这不太实际。字符串不能通过引用传递。它隐式转换为指向其第一个元素的指针,然后按值传递。重要但微小的区别@fuz在纯汇编中,我相信它(仍然)是-没有进行隐式转换。从C或C++调用方,通过指针值传递的字符串不是引用混叠,但我认为它与此问答无关,但我写的离金属很近(故意)。