Вопрос № 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 ;почему? и как выводить данные?
Отправлен: 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
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!