Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Возврат структуры из подпрограммы


Автор: Fantaz1 11.4.2011, 22:57
Помогите решить задачу! Мне надо написать процедуру которая заполняет структуру данными и возвращает эти значения. Структура имеет такие переменные:

Код

number db ?,?
liter db ?,?
dvz db ?,?
first db ?,?,?
last db ?,?


Входные параметры процедуры - 2 переменные (адрес строки и количество символов в ней)
Подскажите мне только начало функции и конец, как принять переменные и вернуть структуру из функции.
И еще одно! Параметры передаются и возвращаются через стек!

Автор: iff 12.4.2011, 11:45
Цитата(Fantaz1 @  11.4.2011,  22:57 Найти цитируемый пост)
Параметры передаются и возвращаются через стек!

То что параметры передаются через стек, это понятно, а вот то, что возвращается результат через стек - это странно.
Обычно в языках высокого уровня при вызове подпрограммы, в стек помещаются адреса передаваемых данных (передача по ссылки) либо их значения (передача по значению). Функция возвращает результат в регистре AL, AX или EAX, возможно также в DX:AX.
Конечно, результат можно передать через стек, но если объем возвращаемых данных больше объема передоваемых, то возникнут сложности. Их можно преодолеть, например создавая кадр стека основной программой и записывать туда передаваемые данные, и оставить место для возвращаемых.

В вашем конкретном случае я бы поступил так:
передал подпрограмме 3 значения: строку (по ссылке), её длинну (по значению) и структуру, которую нужно заполнить (по ссылке, т.е. передаётся адрес структуры, которую надо заполнить). Возвращать тогда не придётся ничего.

Цитата(Fantaz1 @  11.4.2011,  22:57 Найти цитируемый пост)
Подскажите мне только начало функции и конец

Код

MyProc proc near
   push bp
   mov bp, sp
   push ax cx si di

   mov si, [bp+8] ;si содержит адрес строки
   mov cx, [bp+6] ;cx содержит её длину
   mov di, [bp+4] ;di содержит адрес структуры
   mov al, [si] ;взять первый символ строки
   mov [di+6], al ;положить его в первый байт переменной first

   pop di si cx ax bp
   ret 6
MyProc endp

Вызов подпрограммы из основной осуществляется так:
Код

.data
dat1 label byte
number db ?,?
liter db ?,?
dvz db ?,?
first db ?,?,?
last db ?,?

str1 db 'sdffrfrgregregrth'

lenstr dw 17

.code
push offset str1
push lenstr
push offset dat1
call MyProc
; Либо сокращённым возовом:
;call MyProc pascal, offsrt str1, lenstr, offset dat1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)