如何在 MASM 中 return 多个值

How to return multiple values in MASM

我试过像这段代码一样传递多个参数来计算 (a-b)^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中return一个过程中的多个值?(显然,寄存器的数量总是有限的。)

在经典调用约定 cdeclstdcall 中,就我而言,您只能 return 一个值。该值在 alaxdx:ax 中 return,具体取决于其大小。

但是,很容易使您自己的调用约定 return 更多值。例如,Go 使用的调用约定 return 在堆栈上附加值,覆盖(?)参数。如果需要return编辑更多的值,调用者需要在调用函数之前分配额外的space。

没有支持 returning 多个值的标准调用约定,因为在 C 中无法做到这一点。

在 C 中,您定义一个结构(或更一般地,user-defined 类型),为该类型的实例分配内存,初始化其字段,并 return 指向它的指针. (或者,您可以让调用者为结构分配内存,并传入指向它的指针。)您可以用汇编语言做同样的事情。

或者,您可以定义自定义调用约定,然后 return 根据您的喜好设置值。例如,您可以 return 它们在您自己选择的特定定义的寄存器中。或者,您可以让调用者在堆栈上分配必要数量的 space,然后将值存储到这些槽中。

只要函数的调用者知道并遵守其调用约定,就没有问题。当完全用汇编语言编写时,您可以很容易地做到这一点,但是如果您尝试将此代码与 C 或任何其他语言接口,您将 运行 遇到问题。