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

Ассемблер? Это просто! Учимся программировать


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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 613
от 26.11.2006, 14:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 369, Экспертов: 28
В номере:Вопросов: 5, Ответов: 10


Вопрос № 63390: Здравствуйте! Пишу на FASMе для консоли WIN32(Win'XP). Не получается клавиатурный ввод - API функция ReadConsoleInput. Кто знает - киньте примерчик пожалуйста. А может быть для консольного режима есть и другие API функции клавиату...
Вопрос № 63398: 1)invoke MessageBox и call MessageBox-это одно и тоже? 2)По-прежнему не могу понять: mov ax,1234h-поместить в ax 1234h ,НО mov [1234] ,4321h -поместить по адресу [1234] 1234h push 4321h-поместить в стек 1234h ...
Вопрос № 63434: Приветствую уважаемых экспертов! У меня такой вопрос возник: в программе под ос DOS производится поиск файла на диске. После его нахождения информация о нём размещается в DTA. Я не переназначал место расположения DTA. Так вот как, ...
Вопрос № 63453: Уважаемые эксперты , у меня такой не празный вопрос . (У меня Win XP s.p.2) Чтобы создать .exe фаил я содаю в переменных средах переменну PATH . Перезагружаю комп, а машина путь то не видет.(Пробовал в Far набрать "set " путь есть). Далее п...
Вопрос № 63518: Тут на retratech.ru такой вопрос нашел, и по-моему здесь нет правильного ответа (нужно было выбрать один "правильный"): Почему перед вызовом дочернего процесса необходимо уменьшать размер сегмента PSP текущей выполняемой программы?...

Вопрос № 63.390
Здравствуйте!
Пишу на FASMе для консоли WIN32(Win'XP).
Не получается клавиатурный ввод - API функция ReadConsoleInput.
Кто знает - киньте примерчик пожалуйста.
А может быть для консольного режима есть и другие API функции
клавиатурного ввода?

С наилучшими пожеланиями, Кузнецов Андрей.
Отправлен: 20.11.2006, 14:11
Вопрос задал: Andreir (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ADSota
Здравствуйте, Andreir!

Консоль можно считать и как файл. Например:
...
buf rb 100'буфер для чтения строки
blen dd 100
.bRead dd ?
...
invoke GetStdHandle,STD_INPUT_HANDLE
push eax
invoke SetConsoleMode,eax,ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT or ENABLE_PROCESSED_INPUT
pop eax
invoke ReadFile,eax,buf,bLen,.bRead,NULL
mov eax,[.bRead]' чИСЛО СЧИТАННЫХ БАЙТОВ

---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Профессионал)
Тел.: 8-916-53-43-916
ICQ: 84611301
----
Ответ отправлен: 20.11.2006, 14:33
Оценка за ответ: 4

Отвечает: Вiктор
Приветствую, Andreir!
в приложении код, моя старая программа. Она без цензуры, так что постарайтесь не упасть в обморок. Но там как раз есть обработка ReadConsoleInput, насколько я помню всё работало.
Вообще суть такая, вызываем ReadConsoleInput, смотрим было ли событие KEY_EVENT, и если да - идём в нужное место в структуре INPUT_RECORD, берём код нажатой кнопки.
(ReadConsoleInput - более "сырой" ввод, а ReadConsole/ReadFile - более "причёсаный" ввод. Если надо ввести имя, то лучше причёсанный ввод, а если надо отловить Esc, enter то лучше сырой ввод - я так думаю)

Приложение:

---------
ни дня без строчки (но не получается)

Ответ отправил: Вiктор (статус: 9-ый класс)
Ответ отправлен: 20.11.2006, 19:41
Оценка за ответ: 5

Отвечает: IceWolf
Здравствуйте, Andreir!
Код для масма скоментариями в приложении, я думаю "перевод" в синтаксис фасма не составит труда. Это программа с http://www.wasm.ru/article.php?article=1022007 . Там описано подробнее. Совет: берете Win32 Programmers Reference/Win32 SDK Reference (Хэлп по винапи-входит в SDK, поставляется с компиляторами си, дельфи, есть отдельно в интернете), поиск->Console Functions-получаете большой список функций с описаниями).
С Уважением, IceW0|f.

Приложение:

---------
Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!

Ответ отправил: IceWolf (статус: 3-ий класс)
Ответ отправлен: 20.11.2006, 21:09
Оценка за ответ: 4


Вопрос № 63.398
1)invoke MessageBox и call MessageBox-это одно и тоже?
2)По-прежнему не могу понять:

mov ax,1234h-поместить в ax 1234h

,НО

mov [1234] ,4321h -поместить по адресу [1234] 1234h
push 4321h-поместить в стек 1234h

Почему только во 2 случае число пишется наоборот?
Отправлен: 20.11.2006, 14:44
Вопрос задал: Xtreme (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Xtreme!
1)Да, это одно и тоже. Просто в разных трансляторах используется разный синтаксис (например, в MASM - invoke, в TASM - call)
2)Слово всегда имеет значение, которое записано в команде,
т.е. в твоих примерах 1234h, 4321h, 4321h
А вот в памяти значения переворачиваются( младший байт пишется первым)!
Они так хранятся...Это особенность интеловских процессоров.
Когда читаешь память, то чтобы получить значение слова, мысленно переворачивай байты.

Выкачай книгу Юрова. Просвещайся... (По этому вопросу обрати внимание, например, на страницу 51)
http://asm.shadrinsk.net/yur.rar (31Мб) pdf-формат

Или здесь
ftp://ftp.rusfaq.ru/books/program/assembler/Юров-Assembler.djvu (16Мб) djvu-формат
Правила подключения читаем здесь http://rusfaq.ru/forum/Opinions/68/3
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 20.11.2006, 15:42

Отвечает: ADSota
Здравствуйте, Xtreme!

1. На самом деле invoke от call сильно отличяется:
invoke в отличие от call это макрос и в нем можно передавать параметры функции для выполнения то есть:
invoke MSGBOX,hwnd,caption,text,eparam
преобразуется в:
push eparam
push text
push caption
push hwnd
и в зависимости от реализации доступа к API функции:
"call dword ptr[DS:MSGBOX]" или "call MSGBOX"

---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Профессионал)
Тел.: 8-916-53-43-916
ICQ: 84611301
----
Ответ отправлен: 20.11.2006, 17:49

Отвечает: IceWolf
Здравствуйте, Xtreme!
1)Не совсем: invoke MessageBox, hWnd, ipText, ipCaption, uType преобразуется компилятором в
push uType ;стиль окошка
push ipCaption ;адрес ASCII строки-заголовка
push ipText ;адрес ASCII строки-текста в окошке
push hWnd ;хэндл родительского окна(или 0,если такового нет)
call MessageBoxA ;сам вызов
Просто call(без параметров) делать нельзя.
2)
Двоеные и учетверённые слова переворачиваются, при записи в память и переворачиваются обратно при чтении из неё.(Подробно я об этом писал в ответе на вопрос 62296). Связано это с тем, что ранние процессоры Intel могли читать за одно обращение лишь один байт. Было удобнее, чтобы младший байт(22h в числе 1122h)находится по младшему адресу, потом в целях совместимости всё так и оставили.
push 1234h-На самом деле и здесь число пишется в память, а значит переворачивается и в памяти(в сегменте стека) это будет выглядеть как 34h 12h.Если дальше бедет выполнено например pop ax,то число из памяти перевернётся и в ax будет 1234h.
Так же: mov [1234h], 5678h
Память: [1234h]-78h,[1236h]-56h.
mov ax,[1234h] ax=5678h
Надеюсь объяснил понятно.
С уважением, IceW0|f.

---------
Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 3-ий класс)
Ответ отправлен: 20.11.2006, 21:09


Вопрос № 63.434
Приветствую уважаемых экспертов!
У меня такой вопрос возник:
в программе под ос DOS производится поиск файла на диске. После
его нахождения информация о нём размещается в DTA. Я не
переназначал место расположения DTA. Так вот как, мне вытащить
информацию о файле и вывести её на экран? Хотя бы посоветуйте
как настроить сегментный регистр данных и смещение чтобы читать
DTA. (Программа формата EXE. В начале программы производится
настройка DS на сегмент данных)
Спасибо!
Отправлен: 20.11.2006, 18:52
Вопрос задал: Const (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Олег Владимирович
Здравствуйте, Const!

DTA при запуске программы располагается в префиксе программного сегмента - PSP - по смещению 80h. На PSP указывают регистры DS и ES. Так как DS вы используете для сегмента данных, для доступа к DTA остаётся ES. Так что ES:80h представляет собой адрес начала DTA уже с самой загрузки программы, т.е. особо ничего настраивать не надо.
Структура DTA:
по смещению 15h от начала DTA - атрибут файла(byte)
16h - время создания(word)
18h - дата создания(word)
1Ah - размер файла(dword)
1Eh - имя файла и расширение(строка ASCIIZ)
Атрибуты файла определяются по установленным битам:
бит 0 (самый младший разряд) - файл только для чтения
бит 1 - скрытый
бит 2 - системный
бит 3 - метка тома
бит 4 - каталог
бит 5 - архивный
Время хранится следующим образом: старшие 5 бит - для часа, следующие 6 бит - минуты, оставшиеся 5 бит - секунды/2, т.е. 20 секунд хранятся в виде числа 10.
Дата: младшие 5 бит - для дня, след. 4 - для месяца, оставшиеся старшие разряды - для года (отсчёт от 1980г)

PS. Получить адрес DTA можно, используя функцию 2Fh прерывания 21h.
Код MOV AH,2Fh; INT 21h занесёт в ES:BX адрес начала DTA

Удачи!
---------
Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 7-ой класс)
Ответ отправлен: 20.11.2006, 19:41
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо что прояснил ситуацию!

Отвечает: IceWolf
Здравствуйте, Const!
Для этого используйте функцию 2Fh прерывания 21h
Вход:AH=2Fh
Выход: ES:BX -сегмент:смещение DTA.
Его можно менять функцией 1Ah. Полее подробно здесь:
http://www.kalashnikoff.ru/Assembler/prog/helpassm.exe
С уважением, IceW0|f.

---------
Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 3-ий класс)
Ответ отправлен: 20.11.2006, 21:50
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Туда я смотрел прежде всего.


Вопрос № 63.453
Уважаемые эксперты , у меня такой не празный вопрос . (У меня Win XP s.p.2) Чтобы создать .exe фаил я содаю в переменных средах переменну PATH . Перезагружаю комп, а машина путь то не видет.(Пробовал в Far набрать "set " путь есть). Далее пишу в командной строке "amake_l11"
(файл l11 имеет расшерение .asm)

Приложение:

Отправлен: 20.11.2006, 20:30
Вопрос задал: Loriendil (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: IceWolf
Здравствуйте, Loriendil!
А почему бы не сделать такой батник:
c:myasminml /c/coff "%1.asm"
c:myasminlink /SUBSYSTEM:CONSOLE "%1.obj"
А дальше компилировать <имя батника>.bat <имя .asm файла>
В приложении батник из masm32-компиляция файла,если есть ресурсов,линковка.
Если же Вы используете MASM32, В меню Project-> Build All.
А для создания .exe манипуляции с переменными среды совсем не обязательны.
С уважением, IceW0|f.

---------
Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 3-ий класс)
Ответ отправлен: 20.11.2006, 22:04
Оценка за ответ: 5


Вопрос № 63.518
Тут на retratech.ru такой вопрос нашел, и по-моему здесь нет правильного ответа (нужно было выбрать один "правильный"):

Почему перед вызовом дочернего процесса необходимо уменьшать размер сегмента PSP текущей выполняемой программы?
1. По умолчанию выполняемой программе отводится вся доступная память
2. Иначе дочерний процесс очистит область памяти, используемую сегментом PSP
3. Для всех сегментов PSP используется одна область свободной памяти
4. Под сегмент PSP отводится слишком много памяти
5. В сегменте PSP хранятся данные системы, которые необходимо освободить
Отправлен: 21.11.2006, 09:54
Вопрос задал: ADSota (статус: Профессионал)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, ADSota!
При запуске программы, формируется блок памяти с максимальным размером.
Поэтому, чтобы запустить новую программу, надо размер блока памяти уменьшить.
Т.е., правильный ответ - 1
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 21.11.2006, 10:31


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное