Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 855
от 18.09.2007, 20:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 383, Экспертов: 26
В номере:Вопросов: 1, Ответов: 1


Вопрос № 101952: Добрый день. Пишу на Масм. Хотел бы проконсультироваться про процедуры. Не знаю, как сформулировать вопрос. Интересует все :) Как передовать параметры в процедуры, как их получать. Вот пример: WriteStr PROC, _str ... WriteStr END...

Вопрос № 101.952
Добрый день. Пишу на Масм.
Хотел бы проконсультироваться про процедуры. Не знаю, как сформулировать вопрос. Интересует все :) Как передовать параметры в процедуры, как их получать. Вот пример:

WriteStr PROC, _str
...
WriteStr ENDP

Теперь чтобы напечатать строку, мне нужно сделать:
push offset myString
call WriteString
Правильно?
И после этого, в стеке уже не будет адреса на эту строку?

Ну и вывод из процедуры? Т.е. вот пример:
.data
intBuffer db 5 DUP (0)
.code
IntToString PROC, _str, _num
mov _str[0], 'h' ; ЕСЛИ ЭТОЙ СТРОКИ НЕ БУДЕТ, ТО
push _str ;WriteString отработает. А так ошибка.
call WriteString ;почему? и как выводить данные?

mov eax, _num
mov _str[0], eax
mov _str[0], 50
mov _str[1], 51
mov _str[2], 52

ret
IntToString ENDP

Спасибо!!
Отправлен: 13.09.2007, 17:54
Вопрос задал: Alexey B (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Зенченко Константин Николаевич
Здравствуйте, Alexey B!

Параметры можно передавать с помощью одного из шести механизмов:
по значению;
по ссылке;
по возвращаемому значению;
по результату;
по имени;
отложенным вычислением.
Параметры можно передавать в одном из пяти мест:
в регистрах;
в глобальных переменных;
в стеке;
в потоке кода;
в блоке параметров.
Подробное описание всех способов Вы найдете в главе 5.2.1 книги С.Зубкова.

И после этого, в стеке уже не будет адреса на эту строку?
Для примера передача параметров с использованием стека.
PUSH EBX
PUSH ECX
CALL MY_FUNCTION
;стек содержит
;esp+08=EBX
;esp+04=ECX
;esp+00=адрес возврата по команде RET

MY_FUNCTION PROC
PUSH EBP
;теперь стек содержит
;esp+12=EBX
;esp+08=ECX
;esp+04=адрес возврата по команде RET
;esp+00=EBP
MOV EBP,ESP
;получаем параметры из стека
MOV EDI,[EBP+12];ebx
MOV ESI,[EBP+08];ecx
;--
;тут сама процедура
;--
;востанавливаем ESP и EBP
MOV ESP,EBP
POP EBP
;возврат если стек будет "чистить" вызывающая программа
RET
;возврат если стек должна "чистить" вызываемая процедура
RET 8;2 параметра по 4 байта
MY_FUNCTION ENDP

Удачи!
---------
И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 14.09.2007, 12:26


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.59 от 17.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное