Вопрос № 36891: А вчём собственно разница между исплоьзованием в открытии файла
функций invoke VirtualAlloc и invoke GlobalAlloc + invoke GlobalLock.
И второе почему не работает такая вещь как:
invoke GetFileSize, hFile
mov MEM_SIZE,eax
invoke G...Вопрос № 36912:
Вопрос насчет навигации в AFD. Значит F1 - трассировка вниз.
Я загружаю прогу и начинаю смотреть по адресам, нажимаю F1 и пошел... но вдруг перепрыгиваю х. знает куда т.е. например
1234:0100
1234:0102
1234:0105
и вдруг прыжок...
Вопрос № 36.891
А вчём собственно разница между исплоьзованием в открытии файла
функций invoke VirtualAlloc и invoke GlobalAlloc + invoke GlobalLock.
И второе почему не работает такая вещь как:
invoke GetFileSize, hFile
mov MEM_SIZE,eax
invoke GlobalAlloc,...,MEM_SIZE
и т.д.
А если резервируемый размер(MEM_SIZE ) задавать явно, то работает!
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Яковлев Сергей Павлович!
Разница хотя бы в том, что функция VirtualAlloc выделяет память во всем виртуальном пространстве процесса, а GlobalAlloc, malloc и все аналогичные - только в куче. Причем, функция VirtualAlloc предоставляет больше режимов работы.
Отвечу на второй вопрос:
Правильный вызов следующий - invoke GetFileSize, hFile, addr dwHighSize
Потому и не работает...
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Студент)
Отправлен: 06.03.2006, 19:32 Оценка за ответ: 5
Отвечает: FreeManC
Здравствуйте, Яковлев Сергей Павлович!
VirtualAlloc работает быстрее.
Ответ отправил: FreeManC (статус: 2-ой класс)
Отправлен: 07.03.2006, 10:08
Вопрос № 36.912
Вопрос насчет навигации в AFD. Значит F1 - трассировка вниз.
Я загружаю прогу и начинаю смотреть по адресам, нажимаю F1 и пошел... но вдруг перепрыгиваю х. знает куда т.е. например
1234:0100
1234:0102
1234:0105
и вдруг прыжок
1289:2F3E
ведь я не увижу, так сказать, работу программы по порядку, как в коде.
А как последовательно смотреть? Как возвратиться в AFD на начало, на 0100h? Что за строка CMD? Какие есть команды?
**************************************
И вот. Как посмотреть в любом отладчике(ваш совет) адрес строки: -Buffer equ $- ? Код из 8-го урока:
...org 100h
;начало
Begin: mov ax,3D00h
mov dx,offset File_name
int 21h
jc Error_file
mov Handle,ax
mov bx,ax
mov ah,3Fh
mov cx,0FF00h
mov dx,offset Buffer
int 21h
mov ah,3Eh
mov bx,Handle
int 21h
mov dx,offset Mess_ok
Out_prog:
mov ah,9
int 21h
int 20h
Handle dw 0
Mess_ok db 'Файл загружен в память! Смотрите в отладчике!$'
Mess_error db 'Не удалось открыть (найти) файл '
File_name db 'c:msdos.sys',0,'!$'
Buffer equ $
CSEG ends ...
Спасибо.
Отправлен: 06.03.2006, 21:40
Вопрос задал: Baim (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Пан Павел Константинович
Здравствуйте, Baim!
F1 в AFDPro - это трассировка с заходом в структуру, а F2 - трассировка без захода в структуру. Для помощи по командам жмите F4, затем PgUP/PgDn.
Сторока CMD неварное от слова COMMAND, эта строка для ввода команд для AFD.
нажимаю F1 и пошел... но вдруг перепрыгиваю х. знает куда т.е. например
1234:0100
1234:0102
1234:0105
и вдруг прыжок
1289:2F3E
ведь я не увижу, так сказать, работу программы по порядку, как в коде.
Почему так? Отвечаю, во первых, смотря какие команды у вас идут. Например:
jmp, int XX, call XXXX
все эти комманды, застовляют делать переход на адрес XXXX, а как я говорил, F1 в AFDPro - это трассировка с заходом в структуру.
{int 21h} - структура.
Попробуйте протроссировать команду int 21h через F1 и F2 и вы всё поймете. Вы понимаете, что 1-ый байт структуры, может находится далеко-далеко от вашего кода. Например: 1-ый байт прерывание int 21h.
И вот. Как посмотреть в любом отладчике(ваш совет) адрес строки: -Buffer equ $- ? Код из 8-го ???
Теория:
File_name db 'c:msdos.sys',0,'!$'
Buffer equ $ - это Дериктива компилятору, здесь слово Buffer, интерпритируется как адрес байта, стоящего после строки c:msdos.sys',0,'!$ Например:
если адрес байта, содер. символ '!' равен 1234, а адрес байта содер. символ '$' равен 1235, то слово Buffer заменяется числом 1236. В отладчике, вы не увидите это:
0100: Buffer equ $
потому что это, Дериктива компилятору.
А если вы хотите, увидеть адрес который был поставлен вместо слово Buffer, то делайте так:
mov dx,offset Buffer или lea dx, Buffer
и в отладчике посмотрите команду или результат присвоения значения регистру dx.
Отвечает: FreeManC
Здравствуйте, Baim!
Buffer equ $ - это просто команда препроцессору компилятора, везде, где ты поставишь слово Buffer поставится адрес конца строки File_name. поэтому после компиляции Buffer нигде не будет, просто будет число. можно написать mov ax,Buffer, после этого в ах занесйтся значение.
Ответ отправил: FreeManC (статус: 2-ой класс)
Отправлен: 07.03.2006, 10:14