首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MASM中返回多个值

如何在MASM中返回多个值
EN

Stack Overflow用户
提问于 2017-02-03 10:19:58
回答 2查看 2K关注 0票数 2

我试图传递多个参数,如此代码,以计算(A)^3:

代码语言:javascript
运行
复制
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中的过程中返回多个值(显然,寄存器的数量总是有限的)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-03 10:53:11

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

在C中,您定义了一个结构(或者更广泛地说,定义了一个用户定义的类型),为该类型的实例分配内存,初始化它的字段,并返回指向它的指针。(或者,您可以让调用方为结构分配内存,并传入指向该结构的指针。)你可以用汇编语言做同样的事情。

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-02-03 10:42:02

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42021917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档