26.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? АВ: это неактуально на данный момент.
9:15 26.10.2008
1. Написать программу, которая сохраняет в памяти информацию о нажатых клавишах - ее скан-код и ее номер. (Задача решена: Вариации на тему Калашникова/Вар_гл_07/Prog09).
Программа в цикле ожидает нажатия клавиши, все нажатия (10 нажатий) запоминает в массиве типа dw.
В этой программе по новому объявлен массив:
mas_w label word
rept 10
Теперь зарезервировано в памяти место для 10 слов, каждая ячейка является пустой (инициирована нулями). И обращаться к массиву можно через метку на него и его адрес:
mov mas_w[si],ax ;запись в массив ax
inc si ;продвижение к следующему элементу массива
inc si ;продвижение к следующему элементу массива
Теперь запись будет происходить в массив словами, а не байтами.
Инициализация массива теперь происходит так, что записывается и скан-код клавиши и ее номер. В общем вся характеристика клавиши, в том числе и управляющие клавиши.
2. Далее надо написать программу, которая считывает из памяти в двоичный файл, чтобы сохранить данные о нажатых клавишах.
15:58 26.10.2008
Программа, которая считывает из памяти в двоичный файл, чтобы сохранить данные о нажатых клавишах написана. Она находится: Вариации на тему Калашникова/Вар_гл_09/Prog02.
Данная программа записала в файл данные из области памяти. Я воспользовался советами из книги Джордейна и изменил код предыдущей программы так, что она стала не считывать данные из файла, а записывать их из памяти компа в файл.
Программа работает следующим образом: будучи запущенной, ожидает от пользователя нажатия клавиш клавиатуры (десять нажатий), записывает в цикле скан-код и номер каждой нажатой клавиши сначала в память компа, а затем копирует из памяти компа в файл. После этого программа завершается.
Для проверки правильности записанного можно обратно записать данные из файла в память. При этом используя другой зарезервированный массив в памяти. И можно будет сравнить один массив (исходный) с другим массивом (результатом). И мы сможем убедиться в том правильно ли программа пишет в файл последовательность нажатых клавиш.
Кажется у нас есть готовая программа на эту тему.
18:01 26.10.2008
Программа, которая считывает из текстового или двоичного файла обратно в массив в памяти написана. Немного модернизировал ранее написанную программу из гл 9 Калашникова. Данная программа находится: Вариации на тему Калашникова/Вар_гл_09/Prog05.
Данные из файла записались точно в отведенный и инициированный предварительно нулями массив mas_w. Теперь отсюда, из этого массива можно будет брать данные для использования их в программе, которая "управляет другой программой". Впрочем данные из этого массива можно перенести например в одну из видеостраниц. Чтобы их не затерла какая-нибудь другая программа. Данные, считанные из файла, оказались верными. Правильно "записались" все клавиши, которые нажимал пользователь в предыдущей программе.