Вернуться на Страничку новостей.

26.10.2008

Октябрь
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? АВ: это неактуально на данный момент.

9:15 26.10.2008

1. Написать программу, которая сохраняет в памяти информацию о нажатых клавишах - ее скан-код и ее номер. (Задача решена: Вариации на тему Калашникова/Вар_гл_07/Prog09).

Программа в цикле ожидает нажатия клавиши, все нажатия (10 нажатий) запоминает в массиве типа dw.

В этой программе по новому объявлен массив:

mas_w label word
rept 10

dw 0000h
endm

Теперь зарезервировано в памяти место для 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. Теперь отсюда, из этого массива можно будет брать данные для использования их в программе, которая "управляет другой программой". Впрочем данные из этого массива можно перенести например в одну из видеостраниц. Чтобы их не затерла какая-нибудь другая программа. Данные, считанные из файла, оказались верными. Правильно "записались" все клавиши, которые нажимал пользователь в предыдущей программе.

Hosted by uCoz