Как запустить двоичный код C из кода сборки? - PullRequest
0 голосов
/ 31 мая 2011

У меня в ассемблере есть этот код, который я хочу открыть с помощью программы на C, передав параметр и после выполнения этой программы на C, значение возвращается в мою программу на ассемблере.

В частности, это:

  • Открыть программу на C, передав в качестве параметра String.
  • Программа на C преобразует эту строку в число с плавающей точкой и вернет ее
  • Я поймаю эту строкуи используйте его так, как мне нужно в моей программе сборки.
[ASM]                 // Executing Assembly code
     \------------->  // Run C Program passing a value as parameter
      [C Program]     // Do Stuff
     /------------->  // Return value that I can catch back in my Assembly code
[ASM]                 // Goes back to executing Assembly code using value the 
                      // value received by the C program.

Важная информация: Я работаю в Linux и не уверен, что такое мой двоичный файл C.*. может быть?Можно также использовать несколько указателей на это.

PS: Мне известны все инструкции с плавающей запятой и бесчисленные другие варианты, которые у меня есть для выполнения всего этого в сборке, но это для моего класса Computer Architecture and Organization.и вот как мне это нужно.

Спасибо всем.

РЕДАКТИРОВАТЬ: Позвольте мне объяснить это немного лучше.

Я скомпилировал этоC-код в файл с именем Convert и поместил его в ту же папку, что и мой код Assembly (.s):

//#includes
int main(int argc, char* argv[]){

    float fVal;
    sscanf(argv[1], "%f", &fVal);

    return fVal;
}

Через Assembly, я хочу выполнить Convert, передав строку как «3.1415» в качестве параметра.Преобразование преобразует его в float и возвращает.

Через сборку я тогда заберу это из стека и использую Float 3.1415.

Все, что я имею в виду, это что-то вроде системного вызова:

push   parameter
push   Executable's name
sys                     ! to wake the system to run my executable

pop    eax              ! pop the Float returned by Convert to EAX

Надеюсь, теперь стало понятнее.

Опять же, спасибо!

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Если вы уверены, что хотите выполнить всю программу, а не просто вызвать функцию, посмотрите, как выполнить системные вызовы (вот ссылка для Linux, хотя у меня нетне читайте этот), а затем посмотрите на fork(2) и wait(2).Вам придется придумать схему для передачи результата обратно, что-то вроде pipe(2).

Редактировать 0:

Вы не можете вернуть float изmain() вот так.Во-первых, он будет приведен к целому числу, поэтому вы потеряете дробную часть.Во-вторых, только часть слова фактически используется ОС для возврата программы из программы status .Посетите справочную страницу wait(2) для макросов, которые вы будете использовать в C для извлечения этого статуса, и загляните в свои заголовки libc, чтобы увидеть, что они делают.

Вам нужно использовать какое-то другое средство для возвратазначение с плавающей точкой из процесса, может быть что-то вроде конвейер Unix .

1 голос
/ 31 мая 2011

Вы, безусловно, можете достичь своей общей цели , заключающейся в том, что вам не нужно писать код преобразования с плавающей запятой вручную в сборке, делегировав вместо этого C, но вы думаете о проблеме неправильно.Вам не нужно вызывать всю C-программу из вашей программы сборки, вам просто нужно вызвать одну функцию .Эта одна функция называется strtod, и вам не нужно ее реализовывать, потому что она уже есть в библиотеке C.

Похоже, что вы работаете на x86-32, так что это должно делать то, что вы хотите:

push    $0x0   ; endptr
push    parameter
call    strtod
addl    %esp, $8
; double return value is in %st(0)
0 голосов
/ 31 мая 2011

Это зависит от того, как компилятор C генерирует сборку / машинный код, и на каком процессоре он работает.

Многие компиляторы 'C' передают аргументы функции в стеке, что означает, что вы должны понимать фрейм стека, создавать его в коде сборки и затем переходить к своей функции / метке 'C'.

Так что, возможно, самый простой способ сделать это - создать приложение Test 'C', которое вызывает вашу функцию, скомпилировать ее и посмотреть сборку, сгенерированную компилятором. Затем используйте эту сборку в качестве примера для вызова из кода вашей сборки.

...