2016-05-20 4 views
1

На самом деле, я использую NASM для моего проекта ученого. Идея состоит в том, чтобы создать одну статическую библиотеку для Math Operations.Как я могу вызвать функцию сборки из другого файла сборки?

Я смог создать отдельные функции в разных asm-файлах. Пример:

  • add_vectorial

    • с 3 параметрами:
      • д, размер
      • v1, массив поплавка
      • v2, массив поплавка
      • к.т. , массив float, который должен содержать r esult операции
  • sub_vectorial

    • с 3 параметрами:
      • д, размер
      • v1, массив поплавка
      • v2, массив поплавка
      • к.т., массив поплавка, что он должен содержать результат работы

Но у меня есть третий файл ассемблера, что он должен вызвать 2 функции: add_vectorial и sub_vectorial для сделать какое-то исчисление.

Я читал, что должен использовать слово вызова для вызова моей внешней функции. Но у меня нет идеи, как я могу передать параметр?

Пример моего кода:

extern add_vectorial 

global operation: ;for linux 

operation: 
      ;Initialize a stack frame 
      push ebp 
      mov  ebp, esp 
      ;Loading the arguments values 
      mov  ebx, [ebp+8] ; ebx='d' 
      mov  ecx, [ebp+12] ; ecx='v1' 
      mov  edx, [ebp+16] ; edx='v2' 
      mov  eax, [ebp+20] ; eax = rt 

      ;Initial the xmm4 registry with zero. 
      xorps xmm4, xmm4 
.body: 

      ;Here, How can i pass the parameters to my asm external function? 
      call add_vectorial 

.done: 
      ;Restore the call's stack frame pointer 
      leave     ; mov esp,ebp/pop ebp 
      ret      ; return from function 

ответ

0

Спасибо, ребята за вашу поддержку ... Наконец-то я нашел одно решение моей проблемы ... Я оставляю мое решение ..

%macro call_fun1 4 
pushad    ;I put this 
push %4 
push %3 
push %2 
push %1 
call sub_vectorial 
add esp, 16 ;4p*4bytes 
popad    ;I put this 
%endmacro 
0

Вы можете передать параметры, вставив их в стек перед тем, как выполнить оператор вызова или вставляя их в регистры первого.

+0

Если вы толкая их в стек, вам нужно будет либо вытащите их из стека в вызывающей функции (как это делает C cdecl) или поместите число после ret, сообщив ему, сколько байтов выскочит из стека (как это делает stdcall) – cup

+0

Привет @cup .. спасибо за вы отвечаете. Я использовал макросы для вызова моих внешних asm-файлов. Я привел один пример моего кода как комментарий. Но у меня новая ошибка. Я не знаю, можете ли вы предложить мне какое-то решение. – zepolar

0

Я создал макрос для вызова своих внешних функций, передавая параметр, как в С.

%macro call_fun1 4 
push %4 
push %3 
push %2 
push %1 
call sub_vectorial 
add ebp, 16 ;4p*4bytes 
%endmacro 

Только тогда, когда я интегрировать этот код с моим основным файлом ASM, дайте мне ошибку последующую: программы принятый сигнал SIGSEGV, ошибка сегментации.

По этой причине я сделал один модульный тест своей функции, но функция работает нормально.

Ошибка только в том, чтобы дать, когда я интегрирую с остальной частью моего кода.

+0

Попробуйте ** добавить esp, 16 **. esp - указатель стека. ebp - базовый указатель. Когда вы вставляете элементы в стек, esp изменяется, ebp остается неизменным. – cup

+0

Спасибо @cup, я исправил ошибку, но, к сожалению, у меня такая же ошибка ... – zepolar

+0

Что такое инструкция return на sub_vectorial? Это ** ret ** или ** ret 16 **? Если это ** ret 16 **, то он ведет себя как вызов std, и вам не нужно добавлять к esp при выходе. – cup

Смежные вопросы