Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2897
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2576
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2120
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1485
Дата выхода:04.11.2011, 01:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:193 / 61
Вопросов / ответов:1 / 1

Консультация # 184347: Здравствуйте! У меня возникли сложности с таким вопросом: необходимо написать в TASM программу благодаря которой введенное с клавиатуры число в 16 -ной системе счисления будет преобразовано и выведено на экран в виде двоичного числа....


Консультация # 184347:

Здравствуйте! У меня возникли сложности с таким вопросом:
необходимо написать в TASM программу благодаря которой введенное с клавиатуры число в 16 -ной системе счисления будет преобразовано и выведено на экран в виде двоичного числа.

Дата отправки: 29.10.2011, 16:40
Вопрос задал: Невалёный Виталий Владимирович (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Невалёный Виталий Владимирович!
Для ввода hex-числа написана своя процедура.
После ввода в буфере получаем hex-цифры 00h-0fh
При выводе группируем по две hex-цифры (побайтно)
При нечетном количестве дополняем самый старший байт цифрой 0.
Ну и напоследок, для получения символов '0' или '1' из hex-цифры,
последовательно сдвигаем очередной бит в FC и складываем с 30h командой adc

Код :
;ввести с клавиатуры число в 16 -ной системе счисления 
;и вывести на экран в виде двоичного числа

stk	segment	para stack	;Сегмент стека с выравниваем на 10h (para)
	dw	256 dup (?)
stk	ends

data	segment
sHex	db	'Enter hex: $'
sBin	db	0dh,0ah,'Bin: $'
sAny	db	0dh,0ah,'Press any key$'

;данные для ввода строки с помощью функции 0ah
buffer	label	byte
max	db	16		;размер буфера
cnt	db	0		;длина введенной hex-строки
hexnums	db	16 dup (?)	;сама введенная hex-строка
data	ends

code	segment
assume	cs:code, ds:data, ss:stk
main	proc
	mov	ax, data	;ds = es = data
	mov	ds, ax
	mov	es, ax

	lea	dx, sHex	;Enter hex:
	mov	ah, 9
	int	21h

	lea	bx, buffer	;Введем hex-число
	call	GetHex

	lea	dx, sBin	;Bin: 
	mov	ah, 9
	int	21h

	call	OutBin		;Выведем двоичную строку, данные в [bx]

	lea	dx, sAny	;выводим строку Press any key
	mov	ah, 9
	int	21h

	mov	ah, 0		;ждем "any key"
	int	16h

	mov	ax, 4c00h
	int	21h
main	endp

;Введем hex-строку
;[bx] - адрес структуры, аналогичной для функции 0ah
GetHex	proc
	lea	di, [bx+2]	;адрес строки
	xor	cx, cx		;счетчик
GH_loop:
	mov	ah, 0		;ждем код
	int	16h
	cmp	al, 0dh		;по Enter-у заканчиваем ввод
	je	GH_ret
	cmp	al, 8		;backspace для исправления ошибки
	je	GH_backspace
	cmp	cl, [bx]	;проверим на переполнение буфера
	je	GH_beep		;первый байт - макс длина
	cmp	al, '0'		;меньше цифр
	jb	GH_loop		;игнорируем
	cmp	al, '9'
	jbe	GH_set_digit	;цифра - запоминаем
	or	al, 20h		;сделаем букву маленькой
	cmp	al, 'a'
	jb	GH_loop		;меньше 'a' игнорируем
	cmp	al, 'f'
	ja	GH_loop		;и больше 'f'
	mov	dl, al		;запомнили для вывода на экран
	sub	al, 'a'-10	;сделаем hex-цифру 'a'-'f' -> 0ah-0fh
GH_set:
	inc	cx		;считаем
	mov	[di], al	;запоминаем
	inc	di		;адрес следующей hex-цифры
GH_out:
	mov	ah, 2		;выводим введенный символ (в dl)
	int	21h
	jmp	GH_loop
GH_set_digit:			;цифра
	mov	dl, al		;сохраним для вывода
	sub	al, '0'		;превратим в hex-цифру '0'-'9' -> 00h-09h
	jmp	GH_set		;запоминаем
GH_backspace:			;backspace
	jcxz	GH_loop		;в начале строки игнорируем
	dec	cx		;уменьшаем счетчик
	dec	di		;и адрес
	mov	dl, al		;уменьшим адрес
	mov	ah, 2
	int	21h
	mov	dl, ' '		;затрем пробелом
	int	21h
	mov	dl, 8		;и опять на одну позицию назад
	jmp	GH_out
GH_beep:
	mov	dl, 7		;при переполнении буфера просигналим beep-ом
	jmp	GH_out
GH_ret:
	mov	[bx+1], cl	;запоминаем длину hex-строки
	ret
GetHex	endp

OutBin	proc			;вывод последовательности 0 и 1
	lea	si, [bx+2]	;адрес строки
	xor	cx, cx		;длина
	mov	cl, [bx+1]	; строки
	jcxz	OB_ret		;пустая строка
	mov	ah, 2		;ф-я вывода на экран
	test	cl, 1		;для нечетной длины дополним старшую тетраду нулем
	jz	OB_loop		;для четной - на вывод
	mov	al, '0'		;0 в старшую тетраду
	inc	cx		;добавим и счетчик цикла
	jmp	OB_continue	;обойдем чтение байт
OB_loop:			;цикл чтения hex чисел
	lodsb			;очередная тетрада
OB_continue:
	push	cx
	mov	cx, 4		;выводим только 4 бит младшей тетрады
	shl	al, 4		;делаем их старшими
OB_bit:				;цикл по битам
	shl	al, 1		;старший бит в С
	push	ax		;сохраним
	mov	dl, '0'
	adc	dl, 0		;dl = '0' или '1'
	int	21h		;выводим
	pop	ax
	loop	OB_bit		;4 бита
	pop	cx		;счетчик тетрад
	test	cl, 1		;разделим пробелом на границе 8 бит
	jz	OB_next		;четное число - в середине байта
	mov	dl, ' '		;пробел для наглядности
	int	21h
OB_next:
	loop	OB_loop		;по всем тетрадам
OB_ret:
	ret
OutBin	endp

code	ends
	end	main

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 29.10.2011, 18:10

5
СПАСИБО
-----
Дата оценки: 29.10.2011, 18:18

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное