Вывод на экран в текстовом режиме средствами MS-DOS

ms-dosВ статье Знакомство с ассемблер мы познакомились с основными функциями MS-DOS для вывода символов. Данная работа посвящена дальнейшему изучению функций MS-DOS.

1. Использование циклических конструкций и функций MS-DOS для вывода символов. Для работы с ассемблером будем использовать NASM, работа с которым подробно описана по адресу http://www.nasm.us, правда на английском языке. Все примеры будут приведены для работы с NASM. Для того чтобы вывести все символы таблицы ASCII наберем следующий код

        org       100h          
start:
	mov	cx,256
	mov	ah,02h
	xor	dl,dl
prt:
	int	21h
	inc	dl
	loop	prt
	ret

Задание 1.1. Выведите все символы в обратном порядке.
Задание 1.2. Выведите все символы без использования функции loop.

 Выведем теперь все символы с разбивкой по 16 в строке. Это можно сделать при помощи следующего кода:

        org       100h        
start:
	mov	cx,256
	mov	ah,02h
	xor	dl,dl
prt:
	int	21h
	push	dx		
	mov	dl,20h		
	int	21h		
	pop	dx		
	inc	dl
	test	dl,0fh		;проверяет не нуль ли в dl, если не нуль, 
				;то выполняется условие перехода, т.е. 
				;проверяется флаг ZF
	jnz	cont_loop
	push	dx
	mov	dl,0ah		;перевод строки
	int	21h
	mov	dl,0dh		;перевод каретки
	int	21h
	pop	dx
cont_loop:
	loop	prt
	ret

Замечание. Обратите внимание на вывод управляющих символов.
Задание 1.3. Выведите все символы с разбивкой по 8 символов в строке.
Задание 1.4. Выведите символы с двумя пробелами между ними.
Задание 1.4. Выведите символы с двумя пробелами между строками.

 2. Вывод чисел средствами ассемблер. Как я уже говорил микропроцессор сам «не понимает», что за данные хранятся в регистре. С точки зрения микропроцессора данные отличаются только размером. Тип же данных — это полностью вопрос программиста, одно и то же значение может быть проинтерпретировано как число или как символ. Рассмотрим раскомментированнй пример для вывода десятичного числа.

	org	100h
start:	

	mov	ax,3414	;Выводим это десятичное число число 
	mov	cx,10	;Основание - 10
	xor	bx,bx	;В этом регистре храним количество цифр. Вначале равно 0

;Сначала разложим десятичное число по степеням 10-ки, 
;цифры храним в стеке
loop1:
	xor	dx,dx	;Команда div в этот регистр записывает остаток, 
			; а в регистр ax записывает результат деления
	div	cx	;Значение берется из ax
	push	dx
	inc	bx	;Увеличиваем значение в регистре на 1
	or	ax,ax	;Если ax=0, то флаг нуля обнулится
	jnz	loop1	;Если ax<>0, то переход по метке

	mov	si, _string	;В регистр si устанавливаем указатель
					;на переменную

;Теперь переводим строки в число
loop2:
	pop	ax
	or	al,30h	;Для 16-тиричных цифр 0..9 код ASCII отличается от
			;соответствующего двоичного представления на 0011 0000
			;или 30h. Поэтому для преобразования кода ASCII
			;в 16-тиричное число 
	mov	[si],al
	inc	si
	dec	bx	;Заметим, что по пред. циклу bx>0
	jnz	loop2

	mov	ah,09h
	mov	dx,  _string
	mov	byte [si],'$'
	int	21h	

	ret
_string		db	''

Задание 2.1. Выведите число в двоичной системе.
Задание 2.2. Выведите число в 16-тиричной системе.
Замечание. Отмечу, что данная работа рассмотрена именно для ассемблера NASM, в TurboAssembler работать не будет, так как необходимы дополнительные директивы.

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru