- 如果我编写一个返回void的函数,根据x86-64约定调用,我可以破坏rax/eax吗?
- 关于返回一个double(因为实际收益将在XMM0发生)
如果我做MOVQ XMM0功能类似的问题 - >獭兔。然后我得到一个数字,可以把它放到在x86-64调用约定中的返回值
union { int, double };
通过int。然后当我通过双重阅读时,我得到了预期的双倍。我的行为有什么缺陷?
回答
rax
是临时寄存器,和double
是在类SSE,所以它是在xmm0
/xmm1
返回。这些记录在SysV ABI中。没有任何东西可以阻止你在将返回值放到它之前使用xmm0
作为scratch。有链接到x86 tag wiki ABI文件。
要回答#3,我们需要查看您的代码。也许它是C++中的UB,或者你的程序集是错误的。
[x86标记wiki]中的当前ABI链接(http://stackoverflow.com/tags/x86/info)。 H.J. Lu的github页面链接到由ABI的LaTeX源代码的当前git修订版构建的PDF。 –
干杯,不知道那些存在。 –
是,
void
功能可以让任何他们想要的所有ARG-返回寄存器(RAX,RDX,XMM0等)。void
表示主叫方不应该对任何随处随地离开的值做任何事情(当然除了RBX,RBP和RSP等呼叫保存寄存器外)。类似什么?一个函数不能被声明为返回
void double
,所以你要问IDK。MOVQ允许您复制
double
的二进制表示。是的,当然,您可以将该64位整数打回到带有C99中的联合的double
。但在C++中,联合类型双引号仅作为GNU扩展而合法。在asm中,无论你想要什么,都可以复制。
注意与int
成员工会是假的这一点,因为这是在X86-64的SysV ABI只有32位。你大概是截尾你的尾数的低32位,所以你可能只测试了这个小尾数的低位无论如何都是零的小整数。
其实,这听起来不对;它应该截断double
的一半,因为x86的浮点字节顺序将包含符号位的字节存储在最高地址处。所以它不应该工作,除非你存储在一个64位商店在联盟的联盟。
- 1. 调用约定函数返回结构
- 2. TCL proc返回值的约定
- 3. 在Python中从回调中返回值
- 4. 如何在ajax调用中返回值?
- 5. 通过回调返回多个错误的Node.js约定?
- 6. RESTful API返回约定
- 7. Ajax回调的返回值?
- 8. c中的调用约定
- 9. 调用函数的返回值在调用函数中未定义
- 10. 返回值在node.js回调函数中未定义
- 11. 在JavaScript回调返回值的jQuery
- 12. 异步调用返回值?
- 13. 返回值调用Matlab
- 14. 当回调包装在回调中时,流星方法不返回返回值
- 15. json-jquery返回未定义的多个值在ajax调用
- 16. 什么是返回布尔值的函数的命名约定?
- 17. 从回调返回值
- 18. Javascript回调返回值
- 19. ios回调块返回值
- 20. 代表返回值回调
- 21. 从select语句中调用返回值
- 22. 如何从postMessage()调用中返回值?
- 23. 调用一个UnmanagedFunctionPointer在C#中的自定义调用约定
- 24. 将具有返回值的lambda传递回调回调没有返回值
- 25. 我的方法中的“返回”在调用方法时不返回值
- 26. 什么是参数/返回值(集合)的代码约定
- 27. 显露的模块模式返回值约定
- 28. 默认函数返回值的JavaScript约定?
- 29. 在C++/CLI调用约定
- 30. 从javascript回调中返回一个值
第3部分你在问什么?你是否正在返回这种类型的工会? –
在x86-64中不是'rax' 64位和'int' 32位?你怎么把32位的64位? – MSalters
您是否阅读过关于amd64的SysV ABI的文档? – fuz