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

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


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

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 482
∙ повысить рейтинг »
Куликов Роман Евгеньевич
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »
Козлова Ольга Александровна
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

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

Консультация # 189356: Здравствуйте. Прошу ваc помочь решить вот такое задание: smile smile smile ...

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

Здравствуйте. Прошу ваc помочь решить вот такое задание: smile smile smile


Дата отправки: 13.05.2016, 12:24
Вопрос задал: yasha190 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, yasha190!
Держите три программки...

Код (Assembler) :: выделить код
data  	segment 
sRes	db	'Y = $'
y 	dw 	0 		;здесь будет результат
data 	ends 

_stack 	segment stack 'stack'
dw 	128 dup(?) 		;стек
_stack 	ends 

assume cs:code, ds:data, ss:_stack 
code 	segment   
start:
	mov	ax, data
	mov	ds, ax
	
	mov	ax, 4		;ax = 4
	cwd			;dx:ax = 4
	mov	bx, 2
	idiv	bx		;ax = 4/2, dx отбрасываем
	mov	di, 17
	sub	di, ax		;di = 17-4/2
	
	mov	ax, 14 		;ax = 14
	mov	bx, 5
	imul	bx		;dx:ax = 14*5
	add	ax, 37
	adc	dx, 0		;dx:ax = 37+14*5 
	mov	bx, 2
	idiv	bx		;ax = (37+14*5)/2, остаток в dx отбрасываем
	mov	si, bx		;si = ax = (37+14*5)/2 

	mov 	ax, 5
	mov	bx, 6
	imul	bx		;dx:ax = 5*6
	add	ax, si		;ax = (37+14*5)/2+5*6

	cwd			;dx:ax = (37+14*5)/2+5*6
	idiv	di		;ax = ((37+14*5)/2+5*6)/(17-4/2), dx отбрасываем
	mov	di, ax		;di = ((37+14*5)/2+5*6)/(17-4/2)
	
	mov	ax, 5 		;ax = 5
	mov	bx, 4
	imul	bx		;dx:ax = 5*4, dx отбрасываем
	
	add	ax, di		;ax = ((37+14*5)/2+5*6)/(17-4/2) + 5*4

	mov 	[Y], ax		;сохраним результат

;выведем результат из ax
	push	ax		;сохраним число в стеке
	mov	ah, 9 
	lea	dx, sRes
	int	21h		;выводим сообщение 
	pop	ax
	
	mov	bx, 10		;система счисления 
	xor	cx, cx		;счетчик в стеке 
	test	ax, ax		;проверим на знак числа
	jge	div_loop	;>=0 просто выводим
	neg	ax		;ax = -ax
	push	ax		;сохраним
	mov	dl, '-'		;выведем знак минуса
	mov	ah, 2
	int	21h
	pop	ax
div_loop:			;цикл получения цифр делением на 10
	xor	dx,dx 
	div	bx		;получаем младшую цифру 
	push	dx		;запоминаем в стеке 
	inc	cx		;считаем 
	test	ax,ax		;повторяем пока не ноль в ах 
	jnz	div_loop
	
dig_loop:			;цикл вывода цифр в обратном порядке
	pop	dx		;извлекаем цифру 
	add	dl,'0'		;переводим в символ 
	mov	ah, 2
	int	21h		;выводим на экран 
	loop	dig_loop 
	
	xor	ax, ax		;ожидаем любую клавишу 
	int	16h
	
	mov 	ax,4c00h
	int 21h
code 	ends 
end 	start

Код (Assembler) :: выделить код
data  	segment 
sRes	db	'Y = $'
y 	dw 	0 		;здесь будет результат
data 	ends 

_stack 	segment stack 'stack'
dw 	128 dup(?) 		;стек
_stack 	ends 

assume cs:code, ds:data, ss:_stack 
code 	segment   
start:
	mov	ax, data
	mov	ds, ax
	
	mov	ax, 36		;ax = 36
	cwd			;dx:ax = 36
	mov	bx, 4
	idiv	bx		;ax = 36/4, dx отбрасываем
	mov	di, ax		;di = 36/4

	mov	ax, 35		;ax = 35
	cwd			;dx:ax = 35
	mov	bx, 8
	idiv	bx		;ax = 35/8, dx отбрасываем
	add	di, ax		;di = 36/4 + 35/8
	
	mov	ax, 15
	sub	ax, 7
	cwd			;dx:ax = 15-7
	mov	bx, 2
	imul	bx		;dx:ax = (15-7)*2
	add	ax, 34
	adc	dx, 0		;dx:ax = 34+(15-7)*2
	
	idiv	di		;ax = (34+(15-7)*2)/(36/4+35/8), dx отбрасываем
	mov	di, ax		;di = (34+(15-7)*2)/(36/4+35/8)
	
	mov	ax, 34 		;ax = 34
	mov	bx, 2
	imul	bx		;dx:ax = 34*2

	xchg	ax, di		;ax = (34+(15-7)*2)/(36/4+35/8), di = 34*2
	sub	ax, di		; ax = (34+(15-7)*2)/(36/4+35/8) - 34*2
	
	mov 	[Y], ax 	;сохраним результат

;выведем результат из ax
	push	ax		;сохраним число в стеке
	mov	ah, 9 
	lea	dx, sRes
	int	21h		;выводим сообщение 
	pop	ax
	
	mov	bx, 10		;система счисления 
	xor	cx, cx		;счетчик в стеке 
	test	ax, ax		;проверим на знак числа
	jge	div_loop	;>=0 просто выводим
	neg	ax		;ax = -ax
	push	ax		;сохраним
	mov	dl, '-'		;выведем знак минуса
	mov	ah, 2
	int	21h
	pop	ax
div_loop:			;цикл получения цифр делением на 10
	xor	dx,dx 
	div	bx		;получаем младшую цифру 
	push	dx		;запоминаем в стеке 
	inc	cx		;считаем 
	test	ax,ax		;повторяем пока не ноль в ах 
	jnz	div_loop
	
dig_loop:			;цикл вывода цифр в обратном порядке
	pop	dx		;извлекаем цифру 
	add	dl,'0'		;переводим в символ 
	mov	ah, 2
	int	21h		;выводим на экран 
	loop	dig_loop 
	
	xor	ax, ax		;ожидаем любую клавишу 
	int	16h
	
	mov 	ax,4c00h
	int 21h
code 	ends 
end 	start

Код (Assembler) :: выделить код
data  	segment 
sRes	db	'Y = $'
y 	dw 	0 		;здесь будет результат
data 	ends 

_stack 	segment stack 'stack'
dw 	128 dup(?) 		;стек
_stack 	ends 

assume cs:code, ds:data, ss:_stack 
code 	segment   
start:
	mov	ax, data
	mov	ds, ax
	
	mov	ax, 4		;ax = 4
	cwd			;dx:ax = 4
	mov	bx, 3
	imul	bx		;ax = 4*3, dx отбрасываем
	sub	ax, 38		;ax = 4*3-38
	neg	ax		;ax = 38-4*3
	cwd			;dx:ax = 38-4*3
	mov	bx, 3
	idiv	bx		;ax = (38-4*3)/3, dx отбрасываем
	mov	di, ax		;di = (38-4*3)/3
	
	mov	ax, 14 		;ax = 14
	sub	ax, 5		;ax = 14-5
	mov	bx, 3
	imul	bx		;dx:ax = (14-5)*3
	
	add	ax, 36
	adc	dx, 0		;dx:ax = 36+(14-5)*3
	idiv	di		;ax = (36+(14-5)*3)/((38-4*3)/3), dx отбрасываем
	
	mov	bx, 3
	imul	bx		;dx:ax = ((36+(14-5)*3)/((38-4*3)/3))*3
	
	sub	ax, 3		;ax = ((36+(14-5)*3)/((38-4*3)/3))*3-4, dx отбрасываем

	mov 	[Y], ax		;сохраним результат

;выведем результат из ax
	push	ax		;сохраним число в стеке
	mov	ah, 9 
	lea	dx, sRes
	int	21h		;выводим сообщение 
	pop	ax
	
	mov	bx, 10		;система счисления 
	xor	cx, cx		;счетчик в стеке 
	test	ax, ax		;проверим на знак числа
	jge	div_loop	;>=0 просто выводим
	neg	ax		;ax = -ax
	push	ax		;сохраним
	mov	dl, '-'		;выведем знак минуса
	mov	ah, 2
	int	21h
	pop	ax
div_loop:			;цикл получения цифр делением на 10
	xor	dx,dx 
	div	bx		;получаем младшую цифру 
	push	dx		;запоминаем в стеке 
	inc	cx		;считаем 
	test	ax,ax		;повторяем пока не ноль в ах 
	jnz	div_loop
	
dig_loop:			;цикл вывода цифр в обратном порядке
	pop	dx		;извлекаем цифру 
	add	dl,'0'		;переводим в символ 
	mov	ah, 2
	int	21h		;выводим на экран 
	loop	dig_loop 
	
	xor	ax, ax		;ожидаем любую клавишу 
	int	16h
	
	mov 	ax,4c00h
	int 21h
code 	ends 
end 	start

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

НЕ одобряю +1 одобряю!


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

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

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


В избранное