我试图传递多个参数,如此代码,以计算(A)^3:
diffcube:push bp
mov bp,sp
mov ax,[bp+4]
sub ax,[bp+6]
mov bp,ax
mul bp
mul bp
pop bp
ret 4
使用堆栈传递参数很容易,但是如何在MASM中的过程中返回多个值(显然,寄存器的数量总是有限的)。
发布于 2017-02-03 10:53:11
没有支持返回多个值的标准调用约定,因为在C中无法做到这一点。
在C中,您定义了一个结构(或者更广泛地说,定义了一个用户定义的类型),为该类型的实例分配内存,初始化它的字段,并返回指向它的指针。(或者,您可以让调用方为结构分配内存,并传入指向该结构的指针。)你可以用汇编语言做同样的事情。
或者,您可以定义一个自定义调用约定,然后返回任何您喜欢的值。例如,您可以在自己选择的特定、定义的寄存器中返回它们。或者,您可以让调用方在堆栈上分配必要的空间,然后将值存储到这些插槽中。
只要您的函数的调用方知道并遵守其调用约定,您就不会有问题。当完全用汇编语言编写时,您可以很容易地做到这一点,但如果您尝试将此代码与C或任何其他语言接口,则会遇到问题。
发布于 2017-02-03 10:42:02
在经典的调用约定中,cdecl和stdcall,就我而言,您只能返回一个值。该值在al
、ax
或dx:ax
中返回,具体取决于其大小。
但是,很容易制定自己的调用约定来返回更多的值。例如,Go使用的调用约定返回堆栈上的附加值,覆盖(?)争论。如果需要返回更多的值,则调用方在调用函数之前需要分配额外的空间。
https://stackoverflow.com/questions/42021917
复制相似问题