реклама на сайте
подробности

 
 
> Передача аргументов из Си в Асм и обратно, Кто как делает?
=GM=
сообщение Jun 12 2007, 18:29
Сообщение #1


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Народ, у меня такой вопрос назрел.

Для тексасовских процов, кто как передаёт аргументы из головной программы, написанной на Си в ассемблерную подпрограмму и как получает обратно?

До недавнего времени передавал обычно адреса двух массивов, один для входных аргументов, второй для выходных. Ещё раньше передавал значения через стек. Теперь стал задумываться о передаче и получении аргументов по значению.

Стало интересно выяснить, а как вы делаете?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SM
сообщение Jun 14 2007, 06:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(=GM= @ Jun 12 2007, 22:29) *
Стало интересно выяснить, а как вы делаете?


Беру и возвращаю структуру.

т.е.

Код
typedef struct _ret_struct {
...
...
...
} RET_STRUCT;

extern RET_STRUCT ext_func(...);


Ну а делается это в 55хх согласно документации на его С-компилер:

Код
5) The called function returns a value. It is placed in a register using the following convention:
  16-bit integer value:   AL
  32-bit integer value:   ACC  
  64-bit integer value:   ACC/P
  16- or 22-bit pointer:  XAR4

[b]If the function returns a structure, the caller allocates space for the structure and passes the address of the return space to the called function in XAR4. To return a structure, the called function copies the structure to the memory block pointed by the extra argument. [/b]

In this way, the caller can be smart about telling the called function where to return the structure. For example, in the statement s= f(x), where S is a structure and F is a function that returns a structure, the caller can actually make the call as f(&s, x). The function f then copies the return structure directly into s, performing the assignment automatically.

If the caller does not use the return structure value, an address value of 0 can be passed as the first argument. This directs the called function not to copy the return structure.
You must be careful to properly declare functions that return structures both at the point where they are called (so that the extra argument is passed) and at the point where they are declared (so the function knows to copy the result). Returning 64-bit floating-point values (long double) are returned similarly to structures.


Т.е. Вам не надо задумываться о том, где эта структура лежит. Просто вернуть как будто по ссылке, а для С-компилера оно будет как будто по значению. И волки сыты, и овцы целы.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 14 2007, 12:54
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(SM @ Jun 14 2007, 05:51) *
Беру и возвращаю структуру.

Т.е. Вам не надо задумываться о том, где эта структура лежит. Просто вернуть как будто по ссылке, а для С-компилера оно будет как-будто по значению. И волки сыты, и овцы целы.

Ну передача со структурой, также, как и с массивом, достаточно большой гемор, по-моему. В подпрограмме надо все адреса вычислять, получается много накладных расходов.

Цитата(Warlord @ Jun 14 2007, 04:46) *
Вряд ли, ведь функция С может возвратить всего лишь одно значение.

Вот так я возвращаю ТРИ значения, см. фрагмент ниже
Код
; To call from C-program: pending=checkCan(int errors, int status)

_checkCan:

    movl    xar5,#CANAES
    movl    acc,xar5
    mov    *-sp[6],ah
    mov    *-sp[7],al
    movl    xar5,#CANARMP
    movl    acc,*xar5

Два аргумента, errors и status, возвращаются через стек, флаг - через асс. Причём, можно использовать где угодно внутри программы.

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.02644 секунд с 7
ELECTRONIX ©2004-2016