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

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


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

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

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

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

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

Номер выпуска:1495
Дата выхода:10.12.2011, 21:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:185 / 63
Вопросов / ответов:1 / 1

Консультация # 184691: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Необходимо произвести сложение двух десятиразрядных чисел №1 и №2, представленных в двоично-десятичном коде. Для организации сложения следует использовать команды работы со строками. Числа №1 и №2 рассматриваются как цепочки из 5 байтов каждое, записанные в памяти, начиная от младшего байта...


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

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Необходимо произвести сложение двух десятиразрядных чисел №1 и №2, представленных в двоично-десятичном коде. Для организации сложения следует использовать команды работы со строками. Числа №1 и №2 рассматриваются как цепочки из
5 байтов каждое, записанные в памяти, начиная от младшего байта
к старшему. Программа должна состоять из сегментов данных, кода
и стека.Числа должны быть в упакованном виде(и желательно что бы программа работала с более сложными числами)
Ассемблер-Tasm.exe Исполняемый файл в формате EXE.
Очень надеюсь, что Вы мне поможете.

Дата отправки: 05.12.2011, 21:25
Вопрос задал: Дмитрий (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, Дмитрий!

Захотелось вывести в виде столбика smile

Код :
;сложение двух десятиразрядных чисел №1 и №2, представленных 
;в двоично-десятичном коде. Для организации сложения следует использовать 
;команды работы со строками. Числа №1 и №2 рассматриваются как цепочки из 
;5 байтов каждое, записанные в памяти, начиная от младшего байта 
;к старшему. Программа должна состоять из сегментов данных, кода 
;и стека.Числа должны быть в упакованном виде(и желательно что бы 
;программа работала с более сложными числами)
;Ассемблер-Tasm.exe Исполняемый файл в формате EXE.

	.186
code	segment	'code'		;начало сегмента кода
	assume	cs:code,ds:data,ss:stk

main	proc	
	mov	ax, data
	mov	ds, ax
	mov	es, ax

;выведем пример
	lea	si, n1		;адрес первого слагаемого
	mov	bx, len		;длина в байтах
	call	PrintBCD	;вывод со смещением в 2 символа

	lea	dx, sPlus	;в следующей строке знак +
	mov	ah, 9
	int	21h

	lea	si, n2		;второе слагаемое
	mov	bx, len
	call	PrintBCD
				;нарисуем в следующей строке черту
	lea	dx, sEOL	;переход на новую строку
	mov	ah, 9
	int	21h
	mov	ah, 2
	mov	dl, ' '		;вначале один пробел
	int	21h
	mov	cx, len		;длина исходных чисел в байтах
	shl	cx, 1		;на каждый байт - два числа
	inc	cx		;плюс 1 на перенос
LineLoop:
	mov	dl, '-'		;рисуем черту
	int	21h
	loop	LineLoop
	lea	dx, sEOL	;переход на новую строку
	mov	ah, 9
	int	21h

	call	AddBCD		;складываем!

	lea	si, n		;сумма
	mov	bx, len+1	;длина на 1 больше
	call	PrintBCD1	;выведем с первой позиции (для переноса)

PrintAny:
	lea	dx, sAny	;press any key
	mov	ah, 9
	int	21h

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

	mov	ax, 4c00h
	int	21h		;выход в ДОС

main	endp

;вывод 1 десятичной цифры
;незначащие нули заменяем пробелом
OneBCD	proc
	push	dx		;сохраним считанную пару цифр
	jcxz	PrintSpace	;ch - признак вывода, cl - очередная цифра
				;если cx = 0, то заменяем пробелом
	or	ch, 1		;встретилась цифра не 0, помечаем обязательный вывод
	or	cl, '0'		;делаем символом
	jmp	PrintSymbol
PrintSpace:
	mov	cl, ' '		;незначащие нули меняем на пробел
PrintSymbol:
	mov	dl, cl		;для вывода
	int	21h
	pop	dx
	ret
OneBCD	endp

;вывод BCD-числа
;bx - длина числа в байтах
;si - адрес начала
PrintBCD	proc
	mov	ah, 2		;для выравнивания сначала выведем пару пробелов
	mov	dl, ' '
	int	21h
	int	21h
PrintBCD1:			;точка входа для вывода без пробелов
	xor	cx, cx		;ch = 0 - нули не выводить
	mov	ah, 2		;функция вывода
PrintBCDHiLoop:			;по байтам BCD
	mov	dl, [bx+si-1]	;читаем с конца (сначала старший)
	mov	cl, dl
	shr	cl, 4		;старшая тетрада
	call	OneBCD		;выводим
	mov	cl, dl
	and	cl, 0fh		;младшая тетрада
	call	OneBCD
	dec	bx		;смещаемся к началу
	cmp	bx, 1		;все, кроме первого 
	ja	PrintBCDHiLoop
				;младший байт отдельно
	mov	dl, [bx+si-1]	;читаем
	mov	cl, dl
	shr	cl, 4		;старшая тетрада
	call	OneBCD
	mov	cl, dl
	or	ch, 1		;младшую выводим в любом случае
	and	cl, 0fh		;младшая тетрада
	call	OneBCD
	ret
PrintBCD	endp

AddBCD	proc			;сумма
	lea	di, n		;адрес суммы
	mov	cx, len		;длина чисел в байтах
	lea	si, n1		;первое слагаемое
	lea	di, n2		;второе слагаемое
	lea	bx, n		;сумма
	clc			;для первой команды adc
AddBCDLoop:
	lodsb			;байт первого слагаемого
	mov	ah, al		;сохраним
	xchg	si, di		;si - второе слагаемое, di - первое
	lodsb			;байт второго слагаемого
	xchg	di, bx		;di - сумма, bx - первое слагаемое
	adc	al, ah		;складываем с байтом первого + перенос
	daa			;десятичная коррекция!
	stosb			;сохраняем в сумме
	xchg	si, bx		;si - первое слагаемое, bx - второе
	xchg	di, bx		;di - второе слагаемое, bx - сумма
	loop	AddBCDLoop
	mov	al, 0		;учтем перенос
	adc	al, 0
	mov	di, bx		;сумма
	stosb			;сохраним переполнение в дополнительный байт
	ret
AddBCD	endp

code	ends

data		segment
n1	db	89h,67h,45h,12h,30h	;первое слагаемое
len	equ	$-n1			;длина слагаемых
n2	db	12h,34h,00h,00h,99h	;второе
sPlus	db	0dh,0ah,'+'
sEOL	db	0dh,0ah,'$'
sAny	db	0dh,0ah,'Press any key$'
n	db	len+1 dup (?)		;сумма, на 1 байт больше
data		ends

stk	segment	stack
	dw	100h dup (?)
stk	ends

	end	main

Вывод программы
Код :
  3012456789
+
  9900003412
 -----------
 12912460201
Press any key

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

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


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

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

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



В избранное