Вывести на экран соответствий между символами и их численными обозначениями в памяти компьютера

Обновлено: 06.07.2024

Как уже отмечалось ранее, микропроцессор оперирует двоичными числами. Но на экране компьютера мы видим привычные символы: цифры, буквы и знаки.
Данная тема раскроет секреты вывода на экран отдельных символов и строк.

Знакомство с прерываниями

Множество полезных операции на ассемблере выполняется с помощью инструкции INT (Interrupt - прерывание).
Печать символов и строк выполняется прерыванием INT 21h. Например, требуется вывести на экран символ "A":

  1. В регистр AH занесите функцию 02h (вывод символа): AX = 0200h
  2. В регистр DL занесите ASCII код символа "A": DX = 0041h
  3. Коды [CDh, 21h] инструкции INT 21h занесите в память по адресам: 100h и 101h
  4. Установите регистр IP = 100h
  5. Просмотрите регистры и убедитесь, что инструкция записана верно: INT 21h

Прерывание INT 21h выполняет функцию, заданную в регистре AH. Подпрограмма функции содержит значительное количество инструкций, поэтому трассировка прерывания может завести нас очень далеко. Для выполнения прерывания используем команду "G" (Go), которая выполняет все инструкции подряд. Адрес остановки (т.е. адрес инструкции, следующей за INT 21h) мы укажем непосредственно в команде G:

Операционная система вывела букву "A" и передала управление Debug. По причинам рассмотренным ранее, последняя строка вашего листинга будет выглядеть иначе.

Используя инструкцию INT 21h и справочник Таблица ASCII кодов, выведите следующие символы на экран:

В качестве эксперимента попробуйте трассировать прерывание. Завершить трассировочный "поход" по инструкциям прерывания можно командой "G 102". Аналогичный эксперимент проделайте с командой G, не указывая в ней точку остановки.

Выход из программы

INT 20h - это прерывание, которое сообщает операционной системе о выходе из программы, и о передаче управления консольному приложению. Значит, при использовании INT 20h в наших примерах, управление будет передаваться программе Debug.

Введите коды [CDh, 20h] по адресам 100h и 101h. Проверьте наличие инструкции INT 20h командой "R", и выполните прерывание командой "G":

Прерывание INT 20h сообщает об успешном выполнении программы, и передает управление Debug. Кроме того, INT 20h восстанавливает содержимое всех регистров к виду, в котором они были до запуска программы. То есть, после выполнения INT 20h регистр IP вернется в исходное состояние: IP = 100h

Инструкцию INT 20h логично добавлять в конец каждой программы. Например, объединим INT 21h и INT 20h в одну программу, которая будет печатать заданный символ на экран:

  1. По адресам 100h и 101h введите коды инструкции INT 21h [CDh, 21h]
  2. По адресам 102h и 103h введите коды инструкции INT 20h [CDh, 20h]

Ранее, выполняемую инструкцию мы просматривали в листинге регистров. Для просмотра сразу двух инструкций мы используем команду "U" (Unassemble) - дизассемблирование:

Курсивом помечены инструкции, оставшиеся от программ или данных, отработавших до запуска Debug. С увеличением сложности примеров, размер дизассемблированного листинга также будет увеличиваться.

Проверьте работу программы с другими символами, см. справочник Таблица ASCII кодов.

Ввод программы

До сих пор мы вводили коды инструкций, например: [CDh, 21h]. Но это очень неудобно. В Debug имеется команда "A" (Assemble), позволяющая вводить мнемокоды инструкций:

Параметр 100 означает, что ввод инструкций начнется с адреса 100h.

Команда MOV

Команда "R" позволяет изменять значения регистров до и после запуска программы. В ходе программы, число в регистр можно загрузить командой MOV. Например, загрузим функцию печати числа в регистр AH следующим образом:

Проверьте наличие команды в листинге регистров:

В исходном состоянии AX = 0000. Выполните трассировку, и вновь просмотрите регистры. Теперь AX = 0200 (AH = 02h).

Команда MOV позволяет копировать числа из регистра в регистр. Например, скопируем число из регистра BX в регистр AX:

Загрузите в регистры числа: AX = FF00, BX = 00EE. Выполните трассировку команды. После просмотра регистров вы увидите, что AX = 00EE. Содержимое регистра BX не изменилось.

Следующая программа демонстрирует возможности команды MOV:

Выполните трассировку, анализируя каждый шаг программы.

Команда MOV имеет два ограничения:

Используем команду MOV, для модернизации программы вывода символа на экран:

Программа будет печатать символ "*" (ASCII код 2Ah). Используйте команду "U 100" для проверки введенных инструкций. Убедитесь, что регистр IP = 100h. Выполните программу:

Запись программы на диск

В предыдущем разделе была рассмотрена программа вывода на экран символа "*". Чтобы записать эту программу на диск, следует выполнить три действия:

  1. присвоить программе имя;
  2. указать длину программы;
  3. выполнить запись.

Если программа вывода звездочки уже потеряна, то обратитесь к предыдущему разделу для ее повторного ввода.

Используя команду "N" (Name), присвойте будущему файлу имя:

Программа состоит из четырех двухбайтных инструкций, значит ее длина - 8 байт. Размер программы Debug хранит в регистровой паре [BX:CX]. Регистровая пара позволяет хранить числа размером до FFFFFFFFh. В нашем случае значение длины умещается в одном регистре, поэтому старший регистр пары мы просто обнулим:

Для записи программы на диск используйте команду "W" (Write):

Вывод на экран строки символов

Как отмечалось ранее, прерывание INT 21h может выполнять несколько различных функций. Мы рассмотрели функцию 02h, которая выводит на экран отдельные символы. Для вывода на экран строк, используется функция 09h. Например, требуется вывести на экран строку:

Список ASCII кодов для этой строки следующий:

В конец строки добавляется символ "$" (ASCII код 24h) - это признак конца строки. Получив этот код, прерывание прекращает чтение строки из памяти.

Начиная с адреса 109h, запишите в память коды строки. Переход от одной ячейки памяти к другой выполняйте клавишей [пробел]:

Проверьте введенные коды командой "D" (Dump - дампирование памяти):

Фактически, дамп - это листинг памяти, в основной области которого печатаются коды, а с правой стороны выводятся соответствующие им символы. Для наглядности, коды введенной строки выделены жирным шрифтом.

Начиная с адреса 100h, введите в память программу:

В регистр DX заносится адрес первого символа строки (указатель на строку).

Дизассемблируйте коды программы:

По адресам 100h . 108h находятся коды программы. Начиная с адреса 109h, идут коды строки. Коду 57h ставится в соответствие инструкция PUSH DI - это интерпретация дизассемблера. В регистре DX хранится указатель на строку символов. Используя указатель, прерывание читает все байты, начиная с адреса 109h до кода 24h, как строку символов.

Установите регистр IP = 100h, и запустите программу:

Программа готова к записи на диск. Присвойте программе имя:

Определим размер программы. Первый код находится по адресу 100h, а последний (24h) по адресу 11Eh. Значит длина программы равна: 11Eh - 100h + 1h = 1Fh байт. Занесите размер программы в регистровую пару [BX:CX]: BX = 0, CX = 1F. Запишите программу на диск:

Напишите программы, которые выводят на экран следующие строки:

  1. Люк в сеть открыт.
  2. Virus attack!
  3. Работа выполнена,
    пора отдыхать!

В третьем задании для перевода строки используйте коды 0Ah, 0Dh, см. справочник Таблица ASCII кодов.

Редактирование строк

Измените строку "We are the champions!" на любую другую, и сохраните изменения [F2]. При редактировании помните: символы слева от строки являются кодами программы, а знак $ является признаком конца строки. Все остальное можно менять без последствий.

Здравствуйте, вопрос по 4 модулю, задача 4 - пещера Дракона. Необходимо реализовать возможность выбора сокровищ на заданную сумму - надо все возможные комбинации сокровищ вывести, сумма которых будет максимально приближена к заданной? Или вывести случайные сокровища, сумма которых будет приближена/равна заданной?
Нужна одна из любых возможных комлинаций

Здравствуйте, вопрос по 4 модулю, задача 4 - пещера Дракона. Необходимо реализовать возможность выбора сокровищ на заданную сумму - надо все возможные комбинации сокровищ вывести, сумма которых будет максимально приближена к заданной? Или вывести случайные сокровища, сумма которых будет приближена/равна заданной?
Нужна одна из любых возможных комбинаций

Добрый день , 4 модуль агрегация , 4 задача, счета
Счета. Клиент может иметь несколько счетов в банке. Учитывать возможность блокировки/разблокировки счета. Реализовать поиск и сортировку счетов.
Вычисление общей суммы по счетам. Вычисление суммы по всем счетам, имеющим положительный и отрицательный балансы отдельно.
можно ли использовать arraylist??

@Artofpaganini да, в этом модуле и в дальнейших можно использовать коллекции.

Здравствуйте, вопрос про разделение логики и модели в коде. Предисловие: В вебинарах говорилось, что в модели не должно быть логики, ее нужно переносить в отдельный класс, который этим и будет заниматься. Что я имею и что я хочу сделать: есть классы Student и StudentGroup. Класс Student имеет пару полей (не суть важно), а класс StudentGroup имеет поля - массив объектов класса Student, int-константа равная 10 (Стартовый размер массива при создании объекта StudentGroup). Я хочу сделать увеличение размера массива в случае его полного заполнения (не суть важно каким конкретно образом, для примера - в методе добавления объекта Student проверять условие на заполнение, и в случае необходимости, создать новый массив объектов класса Student с большим размером, перенести ссылки на объекты Student в новый массив и заменить ссылку в StudentGroup на новый массив). Но встает проблема, можно ли хранить данный код, который вроде и логика, но при этом это не касается бизнес-логики, а лишь логика хранилища, если конечно я правильно это понимаю. Хочу разобраться в этом вопросе, если я не правильно понимаю, с радостью приму конструктивную критику. Спасибо.

Пусть преподаватель меня поправит, если что, но вроде как для классов-хранилищ (где полем является коллекция/массив), допускается присутствие методов с логикой, касающейся create/read/update/delete для этой коллекции. Т.е. кроме геттеров/сеттеров можно делать методы типа "добавить", "удалить", "найти" и т.д.

4 модуль агрегация 4 задача Счета. Клиент может иметь несколько счетов в банке. Учитывать возможность блокировки/разблокировки счета. Реализовать поиск и сортировку счетов.
Вычисление общей суммы по счетам. Вычисление суммы по всем счетам, имеющим положительный и отрицательный балансы отдельно.

Можете пояснить как понять, блокировка разблокировка? Т. Е. Если счёт имеет отрицательный баланс то просто вывести напротив него аккаунт заблокирован??

Не совсем понятно, может пример привести пожалуйста!

4 модуль агрегация 4 задача Счета. Клиент может иметь несколько счетов в банке. Учитывать возможность блокировки/разблокировки счета. Реализовать поиск и сортировку счетов.
Вычисление общей суммы по счетам. Вычисление суммы по всем счетам, имеющим положительный и отрицательный балансы отдельно.

я просто делал статус счета on/оff и метод изменения статуса, т.к. никто не блокирует счета с отрицательным балансом, это же не баланс мобильника, и метод изменения статуса недоступен у меня для клиента, это может делать только банк

Представим, что стоит задача вывода на экран соответствий между символами и их численными обозначениями в памяти компьютера.

Решение

Алгоритм решения задачи:

Можно использовать цикл for и перебрать все значения от 0 до 255, поставив им в соответствие символ. В языке программирования Pascal есть специальная функция chr , которая возвращает символ, порядковый номер которого передается ей в качестве аргумента.

Программа на языке Паскаль:

Инструкция if внутри цикла for здесь исключительно для перехода на новую строку после вывода пяти очередных символов.

Можно немного изменить программу и выводить ее как таблицу, из 16 строк и столбцов. Упрощенный код программы тогда может выглядеть примерно так:

Итак, продолжаем наши уроки Паскаль для начинающих. В прошлом уроке мы разобрали строковый тип данных, но там мы упомянули про символы, поэтому прежде чем глубоко изучать тип данных String, мы узнаем о типе Char. Символьный тип данных Char — тип данных, значениями которого являются одиночные символы. Данный тип может содержать всего один любой символ (Например: «*», «/», «.», «!» и другие). Каждый такой символ занимает 8 бит памяти, всего существует 256 восьмибитовых символов. Все символы, используемые символьным типом Char записаны в таблице символов ASCII (American Standart Code for Information Interchange) или Американский стандарт кода для обмена информацией.

К символьному типу применимы 5 функций: Ord, Chr, Pred, Succ и Upcase.

Пример программы на Паскаль с использованием функции Ord:

Пример программы на Паскаль с использованием функции Chr:

Пример программы на Паскаль с использованием функций Pred и Succ:

Функция UpCase применима только для строчных букв английского алфавита. Данная функция преобразует строчные английские буквы в заглавные.

Пример программы на Паскаль с использованием функции UpCase:



На сегодня урок окончен. Помните, что программирование на паскале просто и является основой для многих языков программирования.

Таблица ASCII кодов

Основная таблица ASCII символов Расширенная таблица ASCII символов

Вывод таблицы ascii в Pascal

for i:=1 to 128 do

Basics of software code developmen

Решите задачи. Каждое решение можно оформить отдельным проектом.

FunctionValueZ - Найдите значение функции: z = ( (a – 3 ) * b / 2) + c.

FunctionValueY - Вычислить значение выражения по формуле (все переменные принимают действительные значения):


    - Вычислить значение выражения по формуле (все переменные принимают действительные значения):


ReverseNumbers - Дано действительное число R вида nnn.ddd (три цифровых разряда в дробной и целой частях). Поменять местами дробную и целую части числа и вывести полученное значение числа.

NumbersInSeconds - Дано натуральное число Т, которое представляет длительность прошедшего времени в секундах. Вывести данное значение длительности в часах, минутах и секундах в следующей форме:

    - Для данной области составить линейную программу, которая печатает true, если точка с координатами (х, у) принадлежит закрашенной области, и false — в противном случае:


Triangle - Даны два угла треугольника (в градусах). Определить, существует ли такой треугольник, и если да, то будет ли он прямоугольным.

ThreePoints - Даны три точки А(х1,у1), В(х2,у2) и С(х3,у3). Определить, будут ли они расположены на одной прямой.

Brick - Заданы размеры А, В прямоугольного отверстия и размеры х, у, z кирпича. Определить, пройдет ли кирпич через отверстие.

FunctionValueF - Вычислить значение функции:


SumNumbers - Напишите программу, где пользователь вводит любое целое положительное число. А программа суммирует все числа от 1 до введенного пользователем числа.

FunctionXY - Вычислить значения функции на отрезке [а,b] c шагом h:


SumSquares100 - Найти сумму квадратов первых ста чисел.

ProductSquares200 - Составить программу нахождения произведения квадратов первых двухсот чисел.

NumbersOfChar - Вывести на экран соответствий между символами и их численными обозначениями в памяти компьютера.

DivisorMN - Для каждого натурального числа в промежутке от m до n вывести все делители, кроме единицы и самого числа. m и n вводятся с клавиатуры.

NumberOfDigits - Даны два числа. Определить цифры, входящие в запись как первого так и второго числа.

Ответьте на следующие вопросы.

Не всегда в литературе или обучающих видео-роликах вы можете найти прямой ответ на поставленный вопрос, использующий к тому же одинаковые формулировки. В этом случае необходимо обобщить имеющиеся у вас знания и вывести правильный ответ (ну, или иногда помогает Google :) ).

Читайте также: