我试图传递多个参数,比如这段代码来计算(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中的过程中返回多个值?(显然,寄存器的数量总是有限的。)
答案 0 :(得分:2)
在经典调用约定 cdecl 和 stdcall 中,就我而言,您只能返回一个值。该值会在al
,ax
或dx:ax
中返回,具体取决于其大小。
但是,很容易使自己的调用约定返回更多值。例如,Go使用的调用约定在堆栈上返回附加值,覆盖(?)参数。如果需要返回更多值,则在调用函数之前,调用者需要分配额外的空间。
答案 1 :(得分:1)
没有支持返回多个值的标准调用约定,因为在C中无法执行此操作。
在C中,您定义一个结构(或者更常见的是用户定义的类型),为该类型的实例分配内存,初始化其字段,并返回指向它的指针。 (或者,您可以让调用者为结构分配内存,并传入指向它的指针。)您可以使用汇编语言执行相同的操作。
或者,您可以定义自定义调用约定,然后根据需要返回值。例如,您可以在自己选择的特定定义寄存器中返回它们。或者,您可以让调用者在堆栈上分配必要的空间量,然后将值存储到这些插槽中。
只要您的函数的调用者知道并遵守其调用约定,您就没有问题。完全使用汇编语言编写时,您可以轻松地执行此操作,但如果您尝试使用C或任何其他语言连接此代码,则会遇到问题。