- Ввод-вывод десятичных чисел
- Теоретические сведения
- ЗАДАЧА 1
- РЕШЕНИЕ
- ЗАДАЧА 2
- РЕШЕНИЕ
- Вывод на экран Assembler
- Вспомним о процедурах
- Вывод на экран
- Запуск программы
- 20. Вывод чисел на консоль в ассемблере i8086
- Вывод чисел в двоичном виде
- Вывод чисел в шестнадцатеричном виде
- Вывод чисел в десятичном виде
- Вывод чисел в восьмеричном виде
- Вывод чисел в других системах счисления
- Упражнение
- Вывод числа на экран
- Решение
- Assembler как вывести число
Ввод-вывод десятичных чисел
Методические указания к выполнению лабораторной работы
1) ознакомиться с теоретическим материалом;
2) разобрать реализацию приведенных задач;
3) дописать необходимые команды, создать исполняемые файлы и выполнить программы, реализующие решение задач 1, 2.
4) проверить правильность работы программ на тестах.
Для самопроверки и для контроля преподавателем необходимо выполнить все задачи.
Теоретические сведения
Анализ таблицы кодов ASCII показывает следующее.
В системе кодировки ASCII для любой цифры от 0 до 9 справедливо соотношение
код (цифра) — код (‘0’) = цифра
Так как код символа 0 (‘0’) равен 30 h , то ASCII -код любой цифры от 0 до 9 отличается от соответствующего двоичного представления числа на 30 h .
Поэтому для преобразования ASCII -кода символа (‘0’..’9’) в число, следует из кода символа вычесть 30 h .
При вводе с клавиатуры, например, цифры 5 недостаточно воспользоваться функцией 1 h прерывания 21 h , так как в регистре al в результате будет находиться код символа ’5’, а не число 5.
Для получения числа 5 необходимо еще вычесть 30 h из полученного кода:
mov 21 h ; в al код символа ‘5’
sub al ,30 h ; теперь в al число 5
ЗАДАЧА 1
Пусть в сегменте данных под символическим именем N хранится беззнаковое десятичное число (от 0 до 255). Необходимо записать по адресу KOD цифры (как символы) из десятичной записи числа.
РЕШЕНИЕ
Пусть N = abc , где a , b , c — десятичные цифры числа N .
Для получения правой цифры c надо взять остаток от деления N на 10. Неполное частное от деления — это число ab , ели его разделить на 10, то неполное частное даст цифру а, а остаток — цифру b .
Чтобы получить эти цифры как символы (их затем можно будет вывести на экран), следует к цифре прибавить код ‘0’ (30 h ).
mov ah ,0 ; расширение N в ax до слова (беззнаковое)
div bl ; ah=c, al=ab
mov KOD +2, ah ; записали последнюю цифру
mov ah ,0 ; al = ab , расширение ab до слова (беззнаковое)
div bl ; ah=b, al=a
add ax,’00’ ; ah=b+’0’, al=a+’0’
mov KOD +1, ah ; записали среднюю цифру
mov KOD , al ; записали первую цифру
ЗАДАЧА 2
Ввести десятичное число и записать его в сегмент данных под символическим именем N (размером в один байт).
РЕШЕНИЕ
По очереди вводим цифры и формируем число по схеме Горнера.
Пусть уже введены первые цифры числа, например, 2 и 1, и по ним сформировано число 21. Пусть следующей введена цифра 3. Тогда умножаем предыдущее число на 10 и прибавляем к нему новую цифру: 21*10+3=213. И так для каждой новой цифры.
Замечание. Будем предполагать, что пользователь вводит число в диапазоне 0-255 корректно и ввод завершается нажатием клавиши Enter .
int 21 h ; в al — первый символ
sub al ,30 h ; теперь первая цифра
mov ah ,0 ; расширение до слова
mov cx , ax ; в cx — первая цифра
int 21 h ; в al следующий символ
cmp al ,0 dh ; сравнение с символом Enter
je End ; конец ввода
sub al ,30 h ; в al — следующая цифра
cbw ; расширение до слова
xchg ax , cx ; теперь в ax — предыдущее число, в cx — следующая
Источник
Вывод на экран Assembler
Сегодня мы рассмотрим тему «Вывод на экран Assembler» и разберем программу, которая сможет выводить на экран нашей консоли числа. Для этого нам потребуется изучить несколько новых процедур, а также познакомится с подключаемыми библиотеками и системными файлами.
Вспомним о процедурах
Для начала, я напомню вам, что когда мы изучали с вами процедуры Assembler, то я, подводя итоги, написал, что для процедур с параметрами необходим прототип. Да, это так, но есть одно но: если эта процедура не является стандартной, и не описана где нибудь в подключаемой библиотеки.
Так вот, ранее изученная процедура ExitProcess, а также те процедуры, которые мы сегодня с вами изучим(WriteConsoleA, wsprintf) являются стандартными(на самом деле такого термина нет, но думаю так понятнее), и для них не нужно писать прототип.
Вывод на экран
А теперь перейдем к коду:
Как вы заметили, у нас увеличилось число подключаемых файлов. И как я уже выше написал, все они понадобятся для того, чтобы работали процедуры, которые мы будем использовать далее в этой программе.
Далее будет не очень понятно пока не увидим в действии, но все же попробую объяснить. Первое, что мы делаем, объявляем константу BSIZE со значением 15. Затем в разделе .data , там где объявляются переменные, задаем несколько переменных, которые потребуются как параметры для наших дальнейших процедур.
Стоит отметить переменную buf: запись dup(duplication) говорит о подряд идущих байт, которые выделяются под переменную buf размерностью BSIZE(15). А знак вопроса говорит, что значения байт заранее не определено.
Итак, пока не все понятно, поэтому идем дальше, тут у вас должен сложиться пазл:
Для того, чтобы вывести что нибудь на экран нужно знать дескриптор вывода. Процедура GetStdHandle считывает адрес дескриптора экрана, и по умолчанию записывает его в регистр eax. После, мы записываем это значение из регистра в переменную stdout.
Дальше мы используем процедуру wsprintf. Она нужна для того, чтобы вывести наше сообщение(именно число) в понятном для нас формате, то есть эта процедура преобразования машинного языка в человеческий формат. Для этого используется переменная ifmt.
Ну и за сам вывод отвечает процедура WriteConsoleA. Она принимает 5 параметров, и последним всегда должен идти 0.
Мой совет: лучше запомнить эти процедуры в таком виде, каком они представлены здесь, в наших дальнейших статьях мы практически всегда будем их использовать.
Запуск программы
А сейчас я покажу вам как все это реализовать на практике, после написания кода.
Я создал файл fifth.asm и поместил его в папку BIN. Затем я открываю командную строку, и перехожу в папку BIN с помощью команды cd C:\Users\Никита\BIN (у вас будет другой путь, скорее всего)
Далее компилирую наш файл, прописывая команду amake.bat fifth, если код правильный, то будет как на фото:
Как мы видим, все скомпилировалось без ошибок, но ничего не вывелось на экран. Для того, чтобы наша программа выполнилась, нужно после компиляции запустить файл с расширением .exe(он создается автоматически после правильной компиляции). Прописываем в командной строке fifth.exe, у вас должно получится нечто подобное:
Все прошло успешно! На сегодня на этом закончим c выводом на экран, но в следующих примерах Assembler мы еще будем возвращаться к этой теме, если у вас остались вопросы, то пишите их в комментариях, не забывайте просматривать исходники и предыдущие статьи.
Источник
20. Вывод чисел на консоль в ассемблере i8086
Архитектура ЭВМ и систем › Язык Assembler › i8086 › 20. Вывод чисел на консоль в ассемблере i8086
- В этой теме 2 ответа, 1 участник, последнее обновление 1 год, 3 месяца назад сделано .
Статья основана на материале xrnd с сайта asmworld (из учебного курса по программированию на ассемблер 16-битного процессора 8086 под DOS).
В качестве примера программирования процедур займёмся такой важной проблемой, как вывод на консоль чисел в различных системах счисления. Проблема эта возникает потому, что в ассемблере нет никаких специальных средств для вывода чисел, а с помощью стандартных функций можно выводить только строки.
Следовательно, задача сводится к тому, чтобы преобразовать двоичное число в строку символов, а затем вывести эту строку на экран. Все процедуры в этой части являются лишь примерами, вы можете использовать их или написать свои собственные процедуры, более удобные для вас.
Для начала рассмотрим две полезные процедуры, которые будут использоваться в дальнейшем. Чтобы постоянно не обращаться в коде в функции DOS 09h, удобно написать маленькую процедуру для вывода строки:
В качестве параметра ей передаётся адрес строки в регистре DI. Строка должна оканчиваться символом ‘$’. Здесь используется команда XCHG , которая выполняет обмен значениями двух операндов.
Вторая полезная процедура — вывод конца строки. Она вызывает первую процедуру для вывода двух символов CR(13) и LF(10). Вызывается без параметров и не изменяет регистры.
Вывод чисел в двоичном виде
Алгоритм вывода в двоичном виде очень прост. Нужно проанализировать все биты числа и поместить в строку символы ‘0’ или ‘1’ в зависимости от значения соответствующего бита. Удобно делать это с помощью циклического сдвига в цикле. Сдвинутый бит оказывается в флаге CF, а после завершения цикла в регистре то же значение, что и в начале. Процедура byte_to_bin_str преобразует байт в регистре AL в строку. Адрес буфера для строки передаётся в регистре DI. Процедура всегда записывает в буфер 8 символов, так как в байте 8 бит.
Используя эту процедуру, легко написать ещё одну для вывода слова в двоичном виде:
И наконец вот две процедуры, которые делают то, что нужно. Буфер имеет размер 17 символов, так как в слове 16 бит + символ ‘$’ , обозначающий конец строки.
Результат работы программы выглядит вот так:
Вывод чисел в шестнадцатеричном виде
Этот пример по структуре похож на предыдущий, поэтому для краткости я рассмотрю только сами процедуры преобразования числа в строку. Преобразование в шестнадцатеричный вид удобно выполнять группами по 4 бита, то есть по тетрадам. Каждая тетрада будет представлять собой одну шестнадцатеричную цифру. Я написал отдельную процедуру для преобразования тетрады в символ цифры:
Если значение тетрады от 0 до 9, то достаточно только прибавить код символа ‘0’ (0x30). А если значение больше 9, то надо прибавить ещё 7, чтобы получилась буква ‘A’-‘F’.
Теперь легко можно преобразовать байт в шестнадцатеричную строку, достаточно каждую из его тетрад заменить соответствующей цифрой:
Преобразование слова также не представляет трудности — сначала преобразуем старший байт, затем младший:
Результат работы программы выглядит вот так:
Вывод чисел в десятичном виде
С десятичными числами немного сложнее. Для начала займёмся числами без знака. Чтобы преобразовать число в десятичную строку необходимо в цикле делить его на 10 (это основание системы счисления). Остатки от деления дают нам значения десятичных цифр. Первый остаток — младшая цифра, последний — старшая. Деление продолжается пока частное не равно нулю.
Например, если есть число 125. Делим его на десять: получаем 12, 5 в остатке. Потом делим 12 на десять: получаем 1, 2 в остатке. Наконец, 1 делим на 10: получаем 0, 1 в остатке. Цифры числа, начиная с младшей: 5, 2, 1. Так как обычно десятичные числа пишут, начиная со старшей цифры, то необходимо переставить их наоборот. Я для этого использовал стек.
В первом цикле производится деление, полученные остатки преобразуются в цифры и помещаются в стек. Во втором цикле символы извлекаются из стека (в обратном порядке) и помещаются в строку. Так как максимальное значение слова без знака 65536 (5 цифр), то в буфер записывается максимум 5 символов.
Для вывода байта можно преобразовать его в слово и воспользоваться той же процедурой:
Теперь разберёмся с числами со знаком. Сначала нужно проверить старший бит числа. Если число положительное, то его можно преобразовать также как число без знака. Если число отрицательное, то добавляем в строку символ ‘-‘, а затем инвертируем число и преобразуем как беззнаковое.
Результат работы программы выглядит вот так:
Как вывести на консоль в десятичном виде очень большое число (> 32 бит) читайте здесь.
Вывод чисел в восьмеричном виде
Выводить числа в восьмеричном виде приходится достаточно редко, поэтому подробно описывать не буду. Можно либо делить число последовательно на 8, либо преобразовывать в цифры группы по 3 бита. Я использовал второй вариант.
Результат работы программы:
Вывод чисел в других системах счисления
Реализуется также, как вывод в десятичном виде — с помощью алгоритма последовательного деления на основание системы счисления. Например, если вам нужно вывести число в пятеричной системе счисления, делить надо на 5, а не на 10.
Упражнение
Напишите программу для вывода на консоль массива слов со знаком в десятичном виде (например, через запятую). Для вывода чисел можете воспользоваться моим примером или написать свою собственную процедуру. Результаты можете писать в комментариях или на форуме.
Исходные коды программ целиком:
1. Вывод в двоичном виде:
Источник
Вывод числа на экран
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Вывод числа на экран
Подредактируйте прогу. я кажись все правильно сделал но при выводе ответа на экран. выводится.
Вывод числа на экран
Привет всем! при сложение двух надо вывести на экран вот код SECTION .data mov AH, 3 ; mov.
Вывод числа на экран
Скажите, а как вывести на экран число , » » и ‘\n’ во встроенном ассемблере. (основня программа на.
Вывод числа на экран
Результат вывести на экран в шестнадцатеричном виде. Результат вывести на экран в двоичном виде. .
Решение
Этот код не работает, у меня ничего не выводит при запуске exe-шника.
Добавлено через 12 минут
Все я решил вопрос
Вывод числа из (DX:AX) на экран
Дана функция Y=(3x^3-120)^2 +9x, область допустимых значений строго от 0 до 7, при вводе чисел от 0.
Вывод на экран 32-разрядного числа
В данной программе необходимо реализовать правильное умножение большого числа на 8. Работаю в TASM.
Вывод на экран числа со знаком
Проверка на отрицательное числоmov ah, a ;в регистр ah записываем значение а mov al, b ;в регистр.
Вывод числа на экран из регистра.
Доброго времени суток. Подскажите,пожалуйста,как можно число,записанное например в регистр ax в.
Источник
Assembler как вывести число
Регистрация на форуме тут, о проблемах пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль
| Регистрация Купить рекламу на форуме 15-35 тыс рублей в месяц
попробуй так. mov bx, ax | ||||||||
нет, так не получится!
функция 09 int 21 выводит строку, адрес которой в dx:
Источник