ассемблерный код в программе переменного тока - PullRequest
1 голос
/ 05 декабря 2010
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
 typedef int (FuncPtr)();
 char asmFunc[] = {0x90, 0xB8, 0x10, 0x00, 0x00, 0x00, 0xC3};
 FuncPtr *cFunc = malloc(7);
 memmove(cFunc, asmFunc, 7);
 int result = cFunc();
 printf("result = %d\n", result);
}

Было бы замечательно, если бы кто-то мог починить ассемблерную часть на компьютере Intel i7, потому что это привело бы к segfault на моей Ubuntu

Это лучший способ поместить код на ассемблере в программу на c?

Ответы [ 3 ]

4 голосов
/ 05 декабря 2010

Лучший способ поместить код сборки в исходный файл C - использовать встроенную сборку. Вот хорошая отправная точка . Пример:

int main(void)
{
 int x = 10, y;

 asm ("movl %1, %%eax;"
      "movl %%eax, %0;"
  :"=r"(y) /* y is output operand */
  :"r"(x)  /* x is input operand */
  :"%eax"); /* %eax is clobbered register */
}
2 голосов
/ 05 декабря 2010

Можно написать его без typedef, но приведение к указателям на функции без typedef очень уродливо.

int (*testFuncPtr)(void);

Приведение к этому указателю функции будет выполнено с использованием

(int (*)(void))
1 голос
/ 05 декабря 2010

Ну, это, конечно, не лучший способ включить машинный код в вашу C-программу. Используйте встроенную сборку. Поскольку вы встречаете Ubuntu, я упомяну, что gcc вполне может это сделать.

См. http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...