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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2012, 20:39   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
Лампочка процедуры

Здравствуйте!
Имеется вопрос по процедурам.
Если в самом начале кода написано:
Код:
.386
.model flat,stdcall
option casemap:none
Тогда при написании процедур надо писать просто RET и написание RET N будет являться ошибкой и приведёт к неправильному выполнению программы?




Вот что пишет по поводу процедуры, где параметры передаются через стек (есть аргументы) Владислав Пирогов в своей книге "Ассемблер на примерах" (стр. 94):
"Замечу, что в получившемся фрашменте стек освобождается непосредственно при выходе из процедуры. Дело здесь в том что мы предполагаем что в начале программы был указан стандарт вызова процедуры (конвенция) STDCALL. Если вместо данного стандарта поставить C, то в конце процедуры будет стоять команда RET, а не RET 12. Стандарт вызова можно указать и непосредственно в директиве PROC, например, следующим образом:
PROC1 PROC STDCALL"
а вот здесь сам пример процедуры, о которой писал автор:
Код:
PROC1 proc aa:DWORD, bb:DWORD, cc:DWORD
LOCAL a1:DWORD
LOCAL a2:DWORD
mov EAX,a2
add EAX,cc
RET
PROC ENDP
Dimarik вне форума Ответить с цитированием
Старый 04.01.2012, 21:10   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

начало кода вообще не имеет отношения к выходу из процедуры.

а в книге верно написано, при stdcall вы сами освобождаете стек за собою.
а в cdecl это делает вызывающий.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.01.2012, 12:19   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Короче, при стандарте C надо писать RET, а после вызова процедуры писать ADD ESP, N
А при стандарте stdcall RET N? Правильно?
Но тогда вопрос:
Читаю я туториалы по ассемблеру, взятые с WASM-а и вот какой код приводит автор на странице 291:
Код:
.386
.model flat,stdcall
option casemap:none
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\user32.inc
 
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib
 
IDD_MAINDLG     equ 101
IDC_EDIT        equ 1000
IDM_OPEN        equ 40001
IDM_EXIT        equ 40003
 
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
ShowImportFunctions proto :DWORD
ShowTheFunctions proto :DWORD,:DWORD
AppendText proto :DWORD,:DWORD
 
SEH struct
        PrevLink                dd ?    ; адpес пpедыдущей seh-стpуктуpы
        CurrentHandler  dd ?    ; адpес нового обpаботчика исключений
        SafeOffset              dd ?    ; смещение, по котоpому безопасно
                                        ; выполнять выполненией
        PrevEsp         dd ?    ; стаpое значение esp
        PrevEbp         dd ?    ; стаpое значение ebp
SEH ends
 
.data
AppName                 db "PE tutorial no.6",0
ofn                             OPENFILENAME <>
FilterString            db "Executable Files (*.exe, *.dll)",0,"*.exe;*.dll",0
                                db "All Files",0,"*.*",0,0
FileOpenError           db "Cannot open the file for reading",0
FileOpenMappingError    db "Cannot open the file for memory mapping",0
FileMappingError        db "Cannot map the file into memory",0
NotValidPE              db "This file is not a valid PE",0
CRLF                            db 0Dh,0Ah,0
ImportDescriptor        db 0Dh,0Ah,"================[ IMAGE_IMPORT_DESCRIPTOR
]=============",0
IDTemplate              db "OriginalFirstThunk = %lX",0Dh,0Ah
                                db "TimeDateStamp = %lX",0Dh,0Ah
                                db "ForwarderChain = %lX",0Dh,0Ah
                                db "Name = %s",0Dh,0Ah
                                db "FirstThunk = %lX",0
NameHeader              db 0Dh,0Ah,"Hint Function",0Dh,0Ah
                                db "-----------------------------------------",0
NameTemplate            db "%u %s",0
OrdinalTemplate db "%u (ord.)",0
 
.data?
buffer          db 512 dup(?)
hFile           dd ?
hMapping        dd ?
pMapping        dd ?
ValidPE         dd ?
 
.code
 
RVAToOffset PROC uses edi esi edx ecx pFileMap:DWORD,RVA:DWORD
 
        mov esi,pFileMap
        assume esi:ptr IMAGE_DOS_HEADER
        add esi,[esi].e_lfanew
        assume esi:ptr IMAGE_NT_HEADERS
        mov edi,RVA ; edi == RVA
        mov edx,esi
        add edx,sizeof IMAGE_NT_HEADERS
        mov cx,[esi].FileHeader.NumberOfSections
        movzx ecx,cx
        assume edx:ptr IMAGE_SECTION_HEADER
        .while ecx>0 ; check all sections
                .if edi>=[edx].VirtualAddress
                        mov eax,[edx].VirtualAddress
                        add eax,[edx].SizeOfRawData
                        .if edi < eax ; The address is in this section
                                mov eax,[edx].VirtualAddress
                                sub edi,eax
                                mov eax,[edx].PointerToRawData
                                add eax,edi ; eax == file offset
                                ret
                        .endif
                .endif
                add edx,sizeof IMAGE_SECTION_HEADER
                dec ecx
        .endw
        assume edx:nothing
        assume esi:nothing
        mov eax,edi
        ret
 
RVAToOffset endp
Почему там просто RET а не RET N
Dimarik вне форума Ответить с цитированием
Старый 05.01.2012, 13:19   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

насколько я помню масм сам подставляет ret N в конце вместо ret.(в конце proc)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 05.01.2012 в 13:21.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.01.2012, 14:13   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

ааааааааааааа. Теперь, наконец, понятно. Это просто типа умный МАСМ. Спасибо тебе огромное!
Dimarik вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедуры swillrocker Помощь студентам 1 18.05.2011 21:16
Использование имени процедуры в качестве параметра другой процедуры Alexey355 Помощь студентам 1 23.04.2011 13:59
закончить выполнение процедуры из тела другой процедуры Alaysor Общие вопросы Delphi 14 23.01.2011 05:26
Управляющие структуры, процедуры Function и процедуры Sub Natalo4ka Помощь студентам 0 17.05.2010 22:00
Запуск процедуры из процедуры с дополнением 1sal1 Общие вопросы Delphi 3 06.10.2008 21:54