Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 395
от 11.03.2006, 23:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 275, Экспертов: 23
В номере:Вопросов: 2, Ответов: 4


Вопрос № 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 ) задавать явно, то работает!
Отправлен: 06.03.2006, 16:38
Вопрос задал: Яковлев Сергей Павлович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Яковлев Сергей Павлович!
Разница хотя бы в том, что функция 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

Error_file:
mov dx,offset Mess_error
jmp Out_prog
;конец

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.

С, Уважением MnEm0n!C

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 3-ий класс)
Отправлен: 06.03.2006, 23:51

Отвечает: FreeManC
Здравствуйте, Baim!
Buffer equ $ - это просто команда препроцессору компилятора, везде, где ты поставишь слово Buffer поставится адрес конца строки File_name. поэтому после компиляции Buffer нигде не будет, просто будет число. можно написать mov ax,Buffer, после этого в ах занесйтся значение.
Ответ отправил: FreeManC (статус: 2-ой класс)
Отправлен: 07.03.2006, 10:14


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.18 от 09.03.2006
Яндекс Rambler's Top100

В избранное