· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Работа со структурами

Посл.отвђт Сообщенiе


Дата: Мар 13, 2003 07:49:52

Не подскажете ли, как мне сохранить структуру,
полученную после вызова функции, например (на С++):

LOADED_IMAGE *image;
image = ImageLoad(filename, NULL);

Помогите переписать это на асме (MASM).
Пожалуйста


Дата: Мар 13, 2003 09:12:53

[code]
filename db 'name.ext',0
pLI dd 0 ; pointer to LOADED_IMAGE
...
invoke ImageLoad, ADDR filename, NULL
or eax,eax
jz errLoadImage
mov pLI,eax ; сохранить адрес для unload'а
...
; для использования загрузить полученный адрес
lea ebx,[pLI]
; например, получить Handle to the mapped file.
mov eax,(LOADED_IMAGE ptr ebx).hFile
...
invoke UnloadImage, pli
[/code]

PS разумеется надо описать структуру LOADED_IMAGE


Дата: Мар 13, 2003 10:12:35

Большое спасибо.
Правда у меня такой вариант не компилировался,
пока я не сделал следующее:

.data
pimage dd 0
....

.code
.....
invoke ImageLoad, addr filename, NULL
test eax, eax
jz Exit

mov pimage, eax
mov ebx, [pimage]
mov eax,(LOADED_IMAGE ptr [ebx]).NumberOfSections ; без [] шло сообщение
;invalid use of register

invoke ImageUnload, pimage

Exit:
invoke ExitProcess, eax

Этот код работает, просто я думал, что можно сделать что-нибудь типа:

.data
image LOADED_IMAGE <>

.code
invoke ImageLoad, addr filename, NULL
test eax, eax
jz Exit

mov image, eax
mov eax, image.NumberOfSections
;т.е., чтобы не надо было занимать один регистр
;адрессом структуры (ebx)


Дата: Мар 13, 2003 11:25:20

меня такой вариант не компилировался
Я пропустил квадратные скобки и lea вместо mov (не компилировал, исправлюсь).


Дата: Мар 13, 2003 11:39:31

Если к структуре редко обращаться нужно, а все регистры заняты, то можно так:

mov eax, image
mov eax, [eax][LOADED_IMAGE.NumberOfSections]


Дата: Мар 14, 2003 03:49:42

roma
чтобы не надо было занимать один регистр

Можно скопировать в локальную структуру и работать с ней. Например:
[code]
.const
szHi db 'Hi', 0, 0
szCalc db 'CALC.EXE', 0, 0
szFailed db 'ImageLoad failed', 0, 0

.code

Test proc

PLOADED_IMAGE typedef ptr LOADED_IMAGE

local img : LOADED_IMAGE
local pli : PLOADED_IMAGE

invoke ImageLoad, ADDR szCalc, NULL

.if eax != 0

mov pli,eax
invoke RtlMoveMemory, ADDR img, pli, sizeof img
invoke MessageBox, 0, img.ModuleName, ADDR szHi, MB_OK
invoke ImageUnload, pli

.else

invoke MessageBox, 0, ADDR szFailed, ADDR szHi, MB_OK

.endif

ret
Test endp
[/code]


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.075