Перевести встроенную сборку для поддержки x64 - PullRequest
6 голосов
/ 12 октября 2009

У меня есть небольшой встроенный ассемблерный код, написанный в моем C-коде. Asm проходит через массив и, если необходимо, перемещает значения из другого массива в регистр. В конце концов, прерывание называется. Код похож на это:

cmp arrPointer[2],1h
jne EXIT
mov AX, shortArrPtr[2]
EXIT:
int 3h

Это все работает в x86, но согласно Microsoft: x64 не поддерживает встроенную сборку. Как я могу перевести все это для поддержки x64? Я не смог найти встроенную процедуру компилятора, чтобы выполнить то, что я хочу, и я не могу понять, как я могу передать параметры во внешний файл asm.

1 Ответ

6 голосов
/ 12 октября 2009

Я думаю, вы просто натолкнулись на причину, по которой встроенная сборка является проблемой в заднице - она ​​совершенно непереносима (и не только между архитектурами; компиляторы часто имеют разный и несовместимый синтаксис). Напишите внешний файл сборки и сделайте все, что вам нужно. Передача параметров в процедуры сборки точно такая же, как и передача их функциям C; просто объявите где-нибудь свою сигнатуру функции, и вызывающий код (в C) сделает правильную вещь. Затем реализуйте подпрограмму во внешнем файле сборки (убедитесь, что соблюдаете соглашение о вызовах) и экспортируйте соответствующий символ, чтобы компоновщик связал все правильно. Presto - рабочая сборка!

Пример по запросу. Я не пытался скомпилировать или протестировать это каким-либо образом, так что это может быть не на 100%. Удачи.

myHeader.h:

void *someOperation(void *parameter1, int parameter2);

myAssemblyFile.s:

.text
.globl someOperation

someOperation:
    add %rdx, %rcx
    mov %rcx, %rax
    ret

.end

mySourceCode.c:

#include "myHeader.h" 

void someFunction(void)
{
  void *arg1 = (void *)0x80001000;
  int  arg2  = 12;
  void *returnValue;

  printf("Calling with %x %x\n", arg1, arg2);

  // call assembly function
  returnValue = someOperation(arg1, arg2);

  printf("Returned: %x\n", returnValue);
}
...