Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2010, 11:36   #1
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию Процедуры.

Не давно занялся assembler. Дошел по книге до процедур, вот пример из книги:

Код:
.386
.model flat,stdcall

option casemap:none

include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\kernel32.lib

StrDisp proto :DWORD, :DWORD

.data
msg db "Hello World!", 0dh, 0ah
sWrite dd ?
.code
main:

invoke StrDisp, ADDR msg, sizeof msg
invoke ExitProcess, 0

StrDisp proc StrAddr :DWORD, StrSz :DWORD
sub esp, 8
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov [ebp-4], eax
invoke WriteConsoleA, [ebp-4], [ebp+8], [ebp+12], ADDR[ebp-8], 0
ret 8
StrDisp endp

end main
В 3-ей снизу строке написано ret 8, если я правильно понял тут идет выталкивания адреса возврата из стека и +2 байта к текущему адресу вершины стека, т.е. выталкивается еще два байта. Зачем это делать, если я проверил программой OLLYDBG и там написано RETN 8. Получаеся это лишнее? И второй вопрос. В регистре EBP сохраняется ESP - это делается для того, что программист может быть захочет хранить в стеке локальные переменные?
profi вне форума Ответить с цитированием
Старый 11.06.2010, 12:27   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

profi
В начале процедуры стоит sub esp,8 это автор отвел восемь байт под две локальные переменные, каждая по 4 байта [ebp-4] и [ebp-8]; ассемблер автоматически сгенерировал пролог push ebp / mov ebp,esp а вместо ret 8 был сгенерирован эпилог pop ebp / retn 8; ret 8 стоит чтобы очистить стек от переданных процедуре StrDisp переменных StrAddr и StrSz

Последний раз редактировалось Mikl___; 11.06.2010 в 12:30.
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2010, 12:33   #3
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Все понял, спс.

Последний раз редактировалось profi; 11.06.2010 в 12:44.
profi вне форума Ответить с цитированием
Старый 11.06.2010, 12:47   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

profi
В ассемблере существует правило "нагадил, подотри за собой" то что простительно при программировании на Delphi, C, Basik'e в ассемблере может и не проканать. Поставь вместо ret (это не команда, а макрос) команду retn и ассемблер от переданных процедуре параметров ничего очищать не будет, для короткой программы может быть ошибки и не увидишь а в длинных программах ошибки накапливаются и программа начинает себя вести неодекватно, вплоть до синего экрана смерти (BSOD)
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2010, 15:05   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а почему BSOD то в прикладной программе?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.06.2010, 17:31   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Потому что мелкомягкие стали "ужесточать ошибки". Например, в одной из версий ядра (ВИн ХП) был БСОД при попытке вторичного очищения памяти...
p51x вне форума Ответить с цитированием
Старый 21.06.2010, 17:27   #7
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

чего?! ужесточать ошибки?! при вторичном обращении к памяти бсод это ужесточать ошибки?! принесите и мне то чего вы курите!
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управляющие структуры, процедуры Function и процедуры Sub Natalo4ka Помощь студентам 0 17.05.2010 22:00
Процедуры Hilda Помощь студентам 9 23.12.2009 11:22
процедуры shelest Помощь студентам 1 19.12.2009 20:12
процедуры Maxxx 83 Помощь студентам 3 02.10.2009 19:16
Запуск процедуры из процедуры с дополнением 1sal1 Общие вопросы Delphi 3 06.10.2008 21:54