На самом деле, я использую NASM для моего проекта ученого. Идея состоит в том, чтобы создать одну статическую библиотеку для Math Operations.Как я могу вызвать функцию сборки из другого файла сборки?
Я смог создать отдельные функции в разных asm-файлах. Пример:
add_vectorial
- с 3 параметрами:
- д, размер
- v1, массив поплавка
- v2, массив поплавка
- к.т. , массив float, который должен содержать r esult операции
- с 3 параметрами:
sub_vectorial
- с 3 параметрами:
- д, размер
- v1, массив поплавка
- v2, массив поплавка
- к.т., массив поплавка, что он должен содержать результат работы
- с 3 параметрами:
Но у меня есть третий файл ассемблера, что он должен вызвать 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
Если вы толкая их в стек, вам нужно будет либо вытащите их из стека в вызывающей функции (как это делает C cdecl) или поместите число после ret, сообщив ему, сколько байтов выскочит из стека (как это делает stdcall) – cup
Привет @cup .. спасибо за вы отвечаете. Я использовал макросы для вызова моих внешних asm-файлов. Я привел один пример моего кода как комментарий. Но у меня новая ошибка. Я не знаю, можете ли вы предложить мне какое-то решение. – zepolar