从nasm x86-64调用c函数

时间:2012-01-14 16:54:09

标签: c x86-64 nasm

从我的asm项目中调用C函数。

我正在尝试将整数值推入c函数。

我的代码

mov rdi, [input]
push rdi                  ;push rdi into stack for c function to work with
call dtoch
pop  rdi                  ;to keep stack balanced 

” 我将输入移到错误的寄存器中了吗?

在Linux Ubuntu OS上运行,没有出错,只是没有打印出正确的值。

当我在C环境中运行该功能时,它工作正常,但是在我的nasm项目中,它打印出错误的数字....?

c功能:

void dtoch(int d )
{
int n , r[10], i = 0, number, j = 0;
while (number > 0)
{
r[i] = number%16;
number = number/16;
i++;
j++;
}
printf ("It's hexadecimal equivalent is: ");
for (i = j -1; i > = 0; i--)
{
if (r[i] == 10)
printf("A");
else if (r[i] == 11)
printf("B");
else if (r[i] == 12)
printf("C");
else if (r[i] == 13)
printf("D");
else if (r[i] == 14)
printf("E");
else if (r[i] == 15)
printf("F");
else
printf("%d", r[i]);
}

}

1 个答案:

答案 0 :(得分:2)

x64仅使用__fastcall ,对于Linux,使用AMD64 ABI,请参阅Agner fog的optimization manuals了解差异或这个漂亮的夏季表on wikipedia(在Windows上,请参阅this(Microsoft ABI))。

对于在Linux下运行的示例,您需要RDIPUSH s(并且需要配对的POP。您可以查看完整的AMD64 ABI here,它包含一些编码脚本(在Windows上,您希望您的单个arg进入RCX,再次,不需要PUSH。 )。

一个简单的提示:您可以使用汇编输出编译c调用,并查看编译器生成的代码,GCC上的选项-Wa,-adhln -g应该可以解决问题。