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, а тут можно восстановить пароль

Форум программистов > Низкоуровневое программирование > Assembler — Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
как вывести число
Регистрация

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение — создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова — «Помогите», «Нужна помощь», «Срочно», «Пожалуйста».
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос — одна тема
Прочитайте правила и заново правильно создайте тему.

Кто-нибудь подскажите как на экран вывести число в Ассемблере

Например такой код:
mov AX,6
add AX,5

как вывести результат находящийся в AX

(Если из АХ совсем никак, то хотябы используя переменную, мне важно просто посмотреть результат арифметических действий)

попробуй так.
Ассемблбер давно забросил, так что не полностью уверен в правельности

mov bx, ax
mov ah, 09h
mov dx, bx
int 21h

нет, так не получится!
функция 09 int 21 выводит строку, адрес которой в dx:

Источник

Читайте также:  Как отгладить одежду без утюга
Оцените статью