Назад | Начало урока | Вперед
Содержание

Глава 5

Октябрь
7:50 19.10.2008

Сто лет не писал в дневнике. Теперь придется писать снова. Удобная это штука - дневник.

Проблема такая: Считываем из исходного файла данные побайтно в массив символов в памяти компа. Как известно символы занимают один байт (АВ:а это кстати два 16-ричных символа, а не один!). Надо сделать так, чтобы каждый символ (фактически каждый байт) был представлен в виде hex-кода. Или в виде двоичного кода. Это позволило бы данные двоичных файлов представлять в hex-виде и печатать в таком виде в текстовый файл для изучения. Эту работу фактически делает программа Hackers View. Но она не распечатывает дамп в текстовый файл.

Работал над переводом в формат html-главы 4 "Thinking in C++" Брюса Эккеля. Потоки ввода-вывода. Файловые потоки ввода-вывода.

Так же тестировал все программы из этой главы. Относящиеся к файловым потокам. Глава интересная.

23:03 23.10.2008

Переводил книгу Фельдмана "Системное программирование" в html-формат. Эта книга взята из файла Владислава Пирогова. И находится пока в его же книге. Смотри Язык скриптов/My_HTML_Project/Языки программирования/Язык Ассемблер/Пирогов_статьи.

В книге 20 глав, 10 лабораторных работ. Лучше оформить ее как отдельную книгу.

Чтение из файла в память, чтение из памяти в файл. Перевод 16-ричного числа в двоичный вид. Еще далеко до того, чтобы я мог свободно выполнять эти действия в моих программах.

Все-таки изучать ассемблер надо через примеры.

7:14 24.10.2008

Сегодня начал читать более осмысленно книгу Джордейна "Справочник программиста", Глава 3 "Клавиатура". И здесь нашел исчерпывающий материал на эту тему. Хороший справочник! Читать и еще раз читать! Обращаться. В этом справочнике постоянно идет ссылка на "железо" компа. Это хорошо. И примеры на трех уровнях - высоком, среднем и низком. Средний и низкий уровень - это ассемблер. Высокий - как правило язык-basic.

9:16 25.10.2008

Есть такая небольшая программа у Калашникова: пользователь вводит символы с клавиатуры (нажимает на клавиши) а программа напрямую выводит эти символы в видеобуфер и с него на экран. Программа написана на ассемблер.

Задача следующая:

1. Сделать так, чтобы вводимые символы попадали в сегмент память данных в компе. Чтобы их можно было посмотреть через отладчик. (Задача решена см. запись 9:15 26.10.2008 дневника)

2. Сделать так, чтобы вводимые символы попадали в текстовый файл, который надо предварительно открыть для записи естественно.(Задача решена см. запись 15:58 26.10.2008 дневника)

Далее если сделать программу резидентной, то можно будет отслеживать какие клавиши нажимает пользователь, работая с программой допустим calculator.exe.

3. Написать функцию, которая выводит на экран строку символов в режиме напрямую через видеобуфер. Выводимую строку передавать как аргумент через регистр. Атрибут - цвет символа задается программно. (Задача решена: Вариации на тему Калашникова/Вар_гл_12/Prog06.)

Для решения обратимся к гл 12 Калашникова. Нужный алгоритм там есть, надо оформить его в виде функции.

Теперь обращаю внимание на программу Листинг 12 Калашникова. Функция 88h прерывания 10. Перехват этого прерывания именно с этой функцией. Но я тут могу использовать алгоритм вывода на экран строки нужного цвета. Строка должна быть в DS:SI. Посимвольный вывод строки пока не встретится символ 0 (конец строки). Этот вывод в метке Next_test программы. Причем предварительно экран очищается (забивается пробелами). Сделай такую простую программу - просто вывод строки.

В папке "Вариации на тему Калашникова" (Папка - Книги по ассемблер/Калашников) делаю эту программу. Вариации на тему Калашникова/Вар_гл_12/Prog01.

Здесь показана работа функции: Функция 88h прерывания 10h - вывод строки

Переработал (вычленил код) программу Resid12.asm. В этом коде вывод строки на экран с нужными атрибутами(цвет) и с нужной позиции. Перед выводом строки экран очищается, выводится латиницей строка It is my string. Затем ждет нажатия клавиши. Хороший алгоритм. Можно сделать этот алгоритм функцией! И выводить нужную нам строку вызовом функции.

Кроме того в этой программе демострируется работа операторов lods и stos, rep stos. Как они в цикле символ за сомволом выводят на экран.

Функция lodsb заносит из DS:SI в al один байт, и увеличивает затем SI на единицу (инкременирует).

Функция stosw заносит по адресу ES:DI значение из AX и увеличиваем затем DI на 2. Здесь заносим слово, т.к. stosW, поэтому на два и увеличивается значение DI.

Хорошая программа!

Программа написана в одном сегменте. Все сегменты настроены на сегмент кода.
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG

Затем перед тем как выводить строку, регистру SI передается адрес строки, которую необходимо вывести. То есть DS:SI должны указывать на выводимую строку. DS изначально у нас настроен на сегмент кода, поэтому остается в SI передать смещение (адрес строки).

mov ah,88h ;Функция 88h прерывания 10h - вывод строки (наш резидент!)
mov si,offset String ;DS:SI - указывают на строку
int 10h ;Выводим

Сделал программу Prog06, в которой вывод строки оформил как отдельную функцию (использовано прерывание 10h функция 88h). Передал аргумент (адрес строки) через DS:SI.

Перечитать еще о включаемых файлах, потому, что не получилось сделать функцию в виде отдельного включаемого модуля.

12:51 25.10.2008

Между прочим в программе Юрова Prog_14_3 из главы 14 есть функция подсчета символов в строке. Эта функция вызывается с аргуметом (строкой), адрес которой передан через DS:SI. Можно изменить эту программу, по аналогии с предыдущей нами рассмотренной программой, чтобы использовать функцию вывода строки на экран. Тогда результат подсчета будет выводиться на пустом экране желтым цветом. Вот уже две интересных функции - функция вывода и функция подсчета символов в строке.

Функция подсчета символов в строке и функция вывода строки на экран в режиме напрямую через видеобуфер. Обе эти функции использованы в программе: Вариации на тему Калашникова/Вар_гл_12/Prog13.

21:00 25.10.2008

Вопрос: как превратить двузначное упакованное число, расположенное в al, в двухзначное неупакованное число расположенное соответственно в ah и al? АВ: это неактуально на данный момент.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz