Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат структуры из подпрограммы 
:(
    Опции темы
Fantaz1
Дата 11.4.2011, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 16.1.2009

Репутация: нет
Всего: нет



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

Код

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


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

Это сообщение отредактировал(а) Fantaz1 - 11.4.2011, 23:47
PM MAIL   Вверх
iff
Дата 12.4.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Цитата(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



--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0523 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.