вызов функции c из nasm x86-64 - PullRequest
2 голосов
/ 14 января 2012

Работаю над вызовом функции C из моего проекта asm.

Я пытаюсь вставить целочисленное значение в функцию 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 Ответ

2 голосов
/ 14 января 2012

x64 использует __fastcall только , для Linux используется ABI AMD64, см. руководства по оптимизации Agner fog для различий или эту прекрасную таблицу в Википедии (в Windows см. this (Microsoft ABI)).

Для вашего примера, работающего под Linux, вы хотите, чтобы оно было в RDI, без PUSH s (и парных POP s) . Вы можете просмотреть полный AMD64 ABI здесь , он включает в себя несколько примеров кода (в окнах вы хотите, чтобы ваш единственный аргумент входил в RCX, опять же, PUSH не требуется).

Простой совет: вы можете скомпилировать вызовы c с выводом сборки и посмотреть, какой код генерирует компилятор, опции -Wa,-adhln -g в GCC должны помочь.

...