正在从我的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操作系统上运行,没有错误,只是没有打印出正确的值。
当我在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]);
}

}

最佳答案

x64仅使用__fastcall,对于Linux,使用AMD64 ABI,有关差异,请参见Agner fog的optimization manuals或此漂亮的summery表on wikipedia(在windows上,请参见this(Microsoft ABI))。
对于在Linux下运行的示例,您希望它在RDI中,不需要PUSHs(以及成对的POP)您可以查看完整的AMD64 ABIhere,其中包括一些编码示例(在windows上,您希望您的单个参数进入RCX,同样,不需要PUSH)。
一个简单的提示:您可以使用汇编输出编译您的c调用,并查看编译器生成了什么代码,GCC上的选项-Wa,-adhln -g应该可以做到这一点。

09-09 20:37
查看更多