【发布时间】:2019-01-13 01:19:16
【问题描述】:
我有一个函数声明如下:
double foo(int ** buffer, int size, ...);
该函数是程序cpp实现的一部分。
我使用最后一个参数将多个双变量传递给函数。
问题是在 Mac 上我没有在 rax 寄存器中收到有效数字,而在 ubuntu 上它按预期工作。
一个简单的例子:
CPP
#include <iostream>
extern "C" double foo(int ** buffer, int buffer_size, ...);
int main() {
int* buffer [] = {new int(2), new int(3), new int(4)};
std::cout<< foo(buffer, 2, 1.0, 2.0, 3.0) << '\n';
std::cout<< foo(buffer, 3, 2.0, 3.0) << '\n';
std::cout<< foo(buffer, 3) << '\n';
}
程序集,NASM2
global foo
section .text
foo:
cvtsi2sd xmm0, rax
ret
Mac 输出:
1.40468e+14
1.40736e+14
1.40736e+14
Ubuntu 输出:
3
2
0
程序是 64 位的
【问题讨论】:
-
请注意,此号码存储在
al,而不是rax。事先尝试movzx eax, al清除高位。 -
值在al中
-
@MateuszStompór :这是正确的。 RAX 中唯一重要的部分是 AL。其他位可以是任何东西。正如 fuz 建议的那样,使用
movzx eax, al使所有 RAX 等于 AL 中的值。它恰好在 Ubuntu 上,RAX 的高位已经是 0。在你的 Mac 上,它们不是。试试foo:movzx eax, alcvtsi2sd xmm0, raxret。需要注意的是,当指令的目标是 32 位寄存器时,CPU 零会自动扩展到整个 64 位寄存器。 -
是的,这正是问题所在
标签: linux macos assembly nasm x86-64