Пятница, 29.11.2024
Мой сайт
Меню сайта
Статистика

Онлайн всего: 105
Гостей: 105
Пользователей: 0
Главная » 2016 » Сентябрь » 12 » Языки программирования – 2
13:44
Языки программирования – 2

Языки программирования – 2

Довольно часто возникают ситуации, когда в одном случае надо сделать что-то одно, а в другом другое.
Самый простой вариант – рисование буквы на экране. Никакого текстового режима на электронном уровне не существует. На экране есть только точки – лампочки, которые горят разным цветом. Значит и надо передать последовательность нулей и единиц, в которой нули будут означать чёрный цвет точки а единицы белый (если это обычная белая буква на чёрном фоне).
Когда компьютеру надо нарисовать букву «л»:
http://www.codenet.ru/progr/dos/int_0024.php

… он, точно зная с какого адреса в оперативной памяти начинаются описания изображений букв, лезет туда, отсчитывает смещение равное коду буквы и начинает считывать оттуда информацию включая или не включая «лампочки» на экране.
Изображение буквы это 8 на 8 точек, т.е для передачи изображения буквы требуется аж 8 байт. Стандартного набора регистров ассемблера (ax,bx,dx,cx) хватило бы но это уже предел.
Последовательное считывание нулей и единиц и восприятие последовательности как последовательности команд – простая ситуация и простое действие.
С помощью нулей и единиц в конкретных битах переданного байта может передаваться более сложная информация. Существуют специальные протоколы передачи информации, где указано, как что передаётся и, соответственно, откуда считывать нужную информацию.
Протокол передачи данных от мыши через ps/2:
https://marsohod.org/index.php/ourblog/11-blog/57-ps2proto

Например, если в последнем бите первого передаваемого байта 1, то нажата левая кнопка. Такие нули и единицы, о чём-то сигнализирующие иногда называют флагами, которые либо выставлены либо нет.
С помощью «флагов» работают и условные переходы в ассемблере:
http://osinavi.ru/asm/4.php
Пусть мне надо выполнить одно действие если регистр ax<=50 и другое если записанная в него, например, сумма >50.
А напишу так:
cmp ax,50
jle Rrog_меньше_50

Prog_больше_50:
….
….
Rrog_меньше_50:
Команда cmp (сравнение двух полученных чисел) сравнила информацию и установила «флаг» ZF =1 если ax<=50. Следующая команда jle использует значение этого «флага» и выбирает куда «прыгать», т.е на какой набор команд для выполнения в зависимости от значения этого флага.
Понятно, что флаги тут конкретные, точно оговоренные и всем известные как значения битов в передаваемой информации. Это тоже своеобразный протокол, позволяющий осуществлять взаимодействие. Одни знают куда класть информацию, другие знают, откуда её брать. 
Я думаю, что ассемблер мне больше не понадобиться, но для полноты картины: Пуск->Выполнить->cmd:

debug – вызов программы, опция r – значения регистров на данный момент. Прочие опции:
http://www.celitel.info/klad/nhelp/helpbat.php?dcmd=debug

Видеопамять в текстом режиме:

Там в первых строках экрана были значения регистров. Не очень поняла почему я вижу только AX, зато хорошо видно, что информация хранится по два байта. В первом код буквы, в втором атрибут. Код буквы «A» - 41:
http://unicode-table.com/ru/#0041


… а шестнадцатеричное число 07h означает что как эта так и все остальные буквы на экране выводятся белым на чёрном.
Компьютер работает в основном с двоичной и шестнадцатеричной системой исчисления. В десятичную что-то переводится только при общении с человеком
Двоичная это легко обрабатываемые нули и единицы. Шестнадцатеричные обычно адреса оперативной памяти.
Пусть я хочу найти изображение восклицательного знака с кодом 21. Я знаю, что первые 128 символов кодировки лежат с адреса F000:FA6E
http://www.codenet.ru/progr/dos/int_0024.php
Ещё я знаю, что на одну букву требуется 8 байт, т.е мне нужно сместиться вправо от этого адреса на 21*8 байт. В шестнадцатеричной системе это 108h
https://numsys.ru/

Теперь мне надо прибавить смещение к второй половине адреса, т.е FA6Eh+108h:

А теперь мне осталось посмотреть как выглядит содержание памяти по адресу F000:FB76:

Последовательно записанные шестнадцатеричные числа: 30,.78,78,30,30,0,30. Если перевести их в двоичные, т.е в нули и единицы:
https://numsys.ru/

(или  http://calculatori.ru/perevod-chisel.html)
то будет так:

и так:

А вся последовательность из восьми байтов имеет вид:

… Это и есть восклицательный знак.

 

Просмотров: 328 | Добавил: akostina76 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Календарь
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2024
    Бесплатный конструктор сайтов - uCoz