如何在MASM中返回多个值

时间:2017-02-03 10:19:58

标签: assembly x86 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中的过程中返回多个值?(显然,寄存器的数量总是有限的。)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

没有支持返回多个值的标准调用约定,因为在C中无法执行此操作。

在C中,您定义一个结构(或者更常见的是用户定义的类型),为该类型的实例分配内存,初始化其字段,并返回指向它的指针。 (或者,您可以让调用者为结构分配内存,并传入指向它的指针。)您可以使用汇编语言执行相同的操作。

或者,您可以定义自定义调用约定,然后根据需要返回值。例如,您可以在自己选择的特定定义寄存器中返回它们。或者,您可以让调用者在堆栈上分配必要的空间量,然后将值存储到这些插槽中。

只要您的函数的调用者知道并遵守其调用约定,您就没有问题。完全使用汇编语言编写时,您可以轻松地执行此操作,但如果您尝试使用C或任何其他语言连接此代码,则会遇到问题。