Использование регистров для выходных данных из процедуры

vbgm
На сайте с 26.03.2009
Offline
164
471

Товарищи! Вопрос к знатокам: стоит ли мне использовать регистры для выходных данных из процедуры или прибегать к классическому методу адресации в памяти, как это делают в MS?

Суть вот в чем. Например, выполняя процедуру загрузки файла в память, нам необходимо сохранить адрес загруженных данных и их размер. Программисты MS намеренно разделили весь процесс на одиночные процессы: открытие файла, чтение его размера, резервирование размера памяти, чтение файла в память. Во всех процедурах используется регистр eax для возврата кода ошибки. Это удобно, но каждый раз писать набор одних и тех же команд не имеет смысла. Поэтому я написал процедуру загрузки файла в память и теперь стою перед выбором: возвращать ли мне данные в регистрах или сохранить их в память?

Какие плюсы и минусы одного и другого метода вам видятся?


; #############################################################
LoadFile Proc NameFile:DWORD, HandleMemory:DWORD
; Входные параметры процедуры
; 1 - адрес на имя файла
; 2 - хэндл для выделения памяти
; -------------------------------
; Выходные параметры из процедуры
; eax - код ошибки
; ebx - адрес загруженных данных
; ecx - размер загруженных данных
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Local hFile :DWORD
Local sFile :DWORD
Local pFile :DWORD
Local ReadWrite :DWORD

; Процедура 1. Открываем файл
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
invoke CreateFile, NameFile,
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
mov hFile, eax
test eax, eax
jl LoadFileError1

; Читаем размер файла
; ~~~~~~~~~~~~~~~~~~~
invoke GetFileSize, hFile, NULL
mov sFile, eax
cmp eax, 0
je LoadFileError2
jl LoadFileError3

; Выдемяем память для сообщений
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
invoke HeapAlloc, HandleMemory, NULL, sFile
mov pFile, eax

; Читаем файл
; ~~~~~~~~~~~
invoke ReadFile, hFile,\
pFile,\
sFile,\
ADDR ReadWrite,\
NULL

mov eax, ReadWrite
cmp eax, 0
je LoadFileError4
jl LoadFileError5

invoke CloseHandle, hFile

; Грузим выходные данные
; ~~~~~~~~~~~~~~~~~~~~~~
mov eax, 0 ; Нет ошибки
mov ebx, pFile ; Адрес загруженных данных
mov ecx, sFile ; Размер загруженных данных
ret

; Обработка ошибок
; ~~~~~~~~~~~~~~~~
LoadFileError1:
; Файл не найден
; ~~~~~~~~~~~~~~
mov eax, 0001h ; 00 - процедура, 01 - код ошибки
ret

LoadFileError2:
mov eax, 102
ret

LoadFileError3:
mov eax, 103
ret

LoadFileError4:
mov eax, 304
ret

LoadFileError5:
mov eax, 305
ret

; Коды ошибок -------------------------------------------------
; 00 - нет ошибки
; 01 - файл не найден
; 02 - размер данных равен 0
; 03 - результат меньше 0
; 04 - прочитано 0 байт
; 05 - меньше пить надо
; -------------------------------------------------------------

LoadFile EndP

Памятники из мрамора и гранита (http://pamyat59.ru) Охота на медведя на овсах (http://ohota59.ru)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий