Как вывести строку на экран в Ассемблере
| Как выучить английский |
В наше время любой человек должен знать английский язык. А тем более программист. Потому что довольно большая часть документации существует только на английском. А профессионал не может ждать, пока кто-то переведёт ему документацию. Он должен уметь быстро получать нужную инфорамцию и использовать её, независимо от того, на каком она языке — на английском или на русском. Ссылки на курсы по английскому.
Что бы ни делала ваша программа, в большинстве случаев она должна выводить какие-то данные на экран. И если в языках высокого уровня это делается “лёгким движением руки”, то в ассемблере для этого приходится как следует помучиться.
Правда, в современных воплощениях языка Ассемблера могут быть стандартные макросы или подпрограммы для вывода строк на экран. Однако начинающим будет полезно разобраться с тем, как это можно сделать только с помощью инструкций, без применения каких-либо облегчающих жизнь библиотек.
Итак, выводить строки на экран можно двумя путями:
- Посимвольно (то есть в цикле выводить каждый символ строки).
- Строку целиком.
Кроме того, в текстовом режиме вывод на экран можно выполнить одним из трёх способов:
- С помощью функций DOS.
- С помощью функций BIOS.
- Путём прямой записи в видеопамять.
Третий способ хорош тем, что он сразу записывает данные в видеопамять, что позволяет выполнять вывод более быстро. Однако в наше время он применим, разве что, в учебных целях. Потому что современные операционные системы не позволяют напрямую обращаться к “железу”.
Поэтому, если ваша программа является чуть более, чем учебной, то придётся применять один из первых двух способов. Ну а если вам интересно, как выполнить вывод непосредственно в видеопамять, то посмотреть примеры вы можете здесь или здесь.
Функции вывода DOS
Итак, начнём с функций вывода DOS. Эти функции являются функциями операционной системы DOS, но поддерживаются и операционными системами Windows.
Как я уже говорил, можно напечатать на экране строку в цикле, отдельно выводя каждый символ. Для этих целей можно использовать функции 02h, 06h или недокуметированное прерывание 29h.
Если требуется вывести на экран строку целиком, то можно применить функции 09h и 40h.
Для использования функций DOS надо сначала подготовить необходимые данные, записать номер функции в регистр AH, а затем вызвать прерывание 21h.
Все функции рассматривать здесь не будем. Для примера используем одну из самых простых функций DOS — функцию 09h, которая выводит в стандартное устройство вывода (в нашем случае — на экран) строку, адрес которой находится в DS:DX. Строка должна заканчиваться символом $, иначе функция не поймёт, где конец строки, и программа будет выводить много-много символов из памяти, начиная с указанного адреса. Примерно так, как показано на рисунке:
При правильном использовании на экран будет выведено примерно следующее:
Функции вывода BIOS
Функции BIOS также могут выводить как отдельные символы (функции 09h, 0Ah, 0Eh), так и строки целиком (функция 13h).
Кроме того с помощью функций BIOS можно установить видеорежим, установить или считать положение курсора, а также считать символ и его атрибуты.
Хотя функции DOS тоже могут считывать символы, но всё-таки возможности BIOS более широки.
Для работы с функциями BIOS также сначала надо подготовить данные, записать номер функции в регистр AH, а затем вызвать прерывание 10h.
Для примера рассмотрим функцию 13h. Перед вызовом функции надо:
- Записать номер функции в регистр АН.
- Записать режим вывода в регистр AL:
- бит 0: переместить курсор в конец строки после вывода.
- бит 1: строка содержит не только символы, но и атрибуты. Так что каждый символ описывается двумя байтами — ASCII-код и атрибут. Это можно использовать, если в строке символы должны иметь, например, разный цвет. Если атрибуты одинаковы для всей строки, то этот бит лучше сбросить (обнулить).
- биты 2-7: не используются.
- Записать длину строки в регистр СХ (только число символов, байты атрибутов не учитываются).
- Если строка содержит только символы, то записать в регистр BL атрибут. Этот атрибут будет применяться для всей строки.
- Записать координаты экрана, начиная с которых будет выводиться строка, в регистры DL (столбец — координата Х) и DH (строка — координата Y).
- Записать адрес начала строки в ES:BP.
Рассказывать об остальных функциях, а также об установке атрибутов и прочих вещах сегодня не буду. Если кому интересно, то всё это можно найти в справочных материалах.
Источник
Ввод символа и вывод на экран
Нужна помощь! При вводе символа «1» на экран выводится символ «а»; при вводе «0» программа заканчивает свою работу; на остальные символы программа не реагирует.
Есть небольшие наработки, но не знаю, как их дополнить до полноценной программы
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Ввод с клавиатуры и вывод на экран символа и строки
1. Напишите программу на языке ассемблера, которая: — вводит с клавиатуры произвольный символ; -.
Ввод с клавиатуры и вывод на экран последовательности символов, цвет и фон чередуются через 2 символа.
Здравствуйте, напишите пожалуйста кто может комментарии к программе! Ввод с клавиатуры и вывод на.
Ввод символа с клавиатуры, вывод на экран символа и его кода в десятичной записи
Доброе время суток. Нужно написать программу на ассемблере, которая осуществляет ввод символа с.
Ввод символа из терминала, изменение регистра символа, вывод его в терминал (ассемблер)
Задача:Если вводимы элемент строчный, то перести его в заглавный(и наоборот). Пример:Ввели (a) -.
Вы не знаете как оформить программу ? Как выглядит шапка ? А код написали же
Добавлено через 1 час 48 минут
Ввод символа, очистка экрана, вывод символа в центре экрана
Вывести приглашение к вводу символа, ввести символ, вывести введенный символ в центре очищенного.
Вопрос по ввод-вывод одного символа
//программа работает с английскими символами, с русскими — возникают проблемы #include .
Ввод и вывод символа. Как разобраться?
Всем добрый день! Я составил учебный пример кода для работы (ввода и вывода) с переменными трёх.
Ввод строки S и символа С. Результат: число повторений символа С и порядковые позиции вхождения этого символа в строку
Нужно составить программу, в которой пользователь вводит вручную строку S и символ C. Результатом.
Источник
Вывод первого символа строки
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Вывод кодов ascii каждого символа строки
Вводится строка символов (буквы, цифры). Нужно вывести их коды ascii, а не сами символы (как в этом.
Ввод с клавиатуры и вывод на экран символа и строки
1. Напишите программу на языке ассемблера, которая: — вводит с клавиатуры произвольный символ; -.
Вывод 1-го символа вместо строки в видеорежиме
CSEG segment org 100h begin: mov ax,0B800h mov es,ax mov di,0 mov ah,31 mov al,byte ptr.
Ввод и вывод в программе символа конца строки (доллара), tasm
Помогите пожалуйста отредактировать программу, чтобы она корректно работала при вводе и выводе.
Читайте мануалы.
При запуске программы регистр DS указывает на префикс программы, Вы регистр никак не перенастраиваете. Префикс программы, это системная область, которая доступна программе, только для чтения. и я не думаю, что ОСь даст Вам туда, что-то записать.
При запуске без дебагера, запись в эту область просто игнорируется и Вы выводите символ с кодом CDh = «=’, если выведите следующий символ, то там будет пробел, а вместе это CDh 20h = int 20h первые два байта префикса. Если подумать, то в эту область можно таки записать, но это уже другая тема.
Под дебагером, область префикса программы воспринимается просто как некий адресуемый участок памяти, поэтому все и получается, но если попытаетесь записать в память занятую отладчиком, получите аналогичный результат(см. выше)
Источник
28. Средства ввода-вывода символьной информации
Int 21h – команда, с помощью которой программа, написанная на языка Ассемблера запрашивает сервис DOS для выполнения определённых действий типа ввода данных с клавиатуры или их вывод на экран. Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H.
Номера некоторых функций прерывания INT 21H:
• АН = 01: Ввод с клавиатуры с эхоотображением. Данная функция возвращает значение в регистре AL, Если содержимое AL не равно нулю, то оно представляет собой стандартный ASCII-символ, например букву или цифру.
• АН = 02: Вывод символа. Для ввода символа на экран в текущую позицию курсора необходимо поместить код данного символа в регистр DL.
• АН = 06: Ввод/вывод данных. Может использоваться как для ввода, так и для вывода. Для вывода занесите в DL выводимый символ (но не FFH!) и вызовите прерывание 21Н. Для ввода в DL занесите FFH, выполните прерывание 21Н.
• АН = 09: Вывод строки символов Выводимая строка должна заканчиваться знаком доллара $. Адрес начала строки должен быть помещен в DX. Знак доллара не выводится.
• AH = 0A: Ввод данных в буфер: Определяется максимальная длина вводимого текста. Это необходимо для предупреждения пользователя звуковым сигналом, если набран слишком длинный текст; символы считываются со стандартного ввода вплоть до CR (ASCII 0dH) или до достижения длины MAX-1. если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).. Во второй байт буфера команда возвращает действительную длину введенного текста в байтах. Адрес буфера помещается в региcтр DX.
Источник
Ассемблер. Строки
Обновл. 4 Сен 2021 |
На предыдущих уроках мы уже использовали строки разной длины.
Строки в Ассемблере
Строки с переменной в качестве длины могут содержать столько символов, сколько необходимо. Как правило, длина строки указывается одним из следующих двух способов:
явное содержание длины строки;
использование сигнального символа.
Мы можем явно хранить длину строки, используя символ счетчика местоположения $ , который предоставляет текущее значение счетчика местоположения строки. Например:
Символ $ указывает на byte после последнего символа строковой переменной msg . Следовательно, $ — msg указывает на длину строки. Мы также можем написать:
В качестве альтернативы мы можем хранить строки с завершающим сигнальным символом. Сигнальным символом является специальный символ, который не должен находиться внутри строки. Например:
Строковые инструкции
Каждая строковая инструкция может требовать исходного операнда и операнда назначения. Для 32-битных сегментов строковые инструкции используют регистры ESI и EDI, чтобы указать на операнды источника и назначения, соответственно.
Однако для 16-битных сегментов, чтобы указать на источник и место назначения, используются другие регистры: SI и DI.
Существует 5 основных инструкций для работы со строками в Ассемблере:
MOVS — эта инструкция перемещает 1 byte, word или doubleword данных из одной ячейки памяти в другую;
LODS — эта инструкция загружается из памяти. Если операндом является значение типа byte, то оно загружается в регистр AL, если типа word — загружается в регистр AX, если типа doubleword — загружается в регистр EAX;
STOS — эта инструкция сохраняет данные из регистра (AL, AX или EAX) в память;
CMPS — эта инструкция сравнивает два элемента данных в памяти. Данные могут быть размера byte, word или doubleword;
SCAS — эта инструкция сравнивает содержимое регистра (AL, AX или EAX) с содержимым элемента, находящегося в памяти.
Каждая из вышеприведенных инструкций имеет версии byte, word или doubleword, а строковые инструкции могут повторяться с использованием префикса повторения.
Эти инструкции используют пары регистров ES:DI и DS:SI , где регистры DI и SI содержат валидные адреса смещения, которые относятся к байтам, хранящимся в памяти. SI обычно ассоциируется с DS (сегмент данных), а DI всегда ассоциируется с ES (дополнительный сегмент).
Регистры DS:SI (или ESI) и ES:DI (или EDI) указывают на операнды источника и назначения, соответственно. Предполагается, что операндом-источником является DS:SI (или ESI), а операндом назначения — место в памяти, на которое указывает пара ES:DI (или EDI).
Для 16-битных адресов используются регистры SI и DI, а для 32-битных адресов используются регистры ESI и EDI.
В следующей таблице представлены различные версии строковых инструкций и предполагаемое место операндов:
Основная инструкция | Операнды в: | Операция byte | Операция word | Операция doubleword |
MOVS | ES:DI, DS:SI | MOVSB | MOVSW | MOVSD |
LODS | AX, DS:SI | LODSB | LODSW | LODSD |
STOS | ES:DI, AX | STOSB | STOSW | STOSD |
CMPS | DS:SI, ES:DI | CMPSB | CMPSW | CMPSD |
SCAS | ES:DI, AX | SCASB | SCASW | SCASD |
Инструкция MOVS
Инструкция MOVS используется для копирования элемента данных (byte, word или doubleword) из исходной строки в строку назначения. Исходная строка указывается с помощью DS:SI , а строка назначения указывается с помощью ES:DI .
Источник