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

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


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

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

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

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

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

Консультация # 189133: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите написать код на языке ассемблера для решения данного уравнения ...
Консультация # 189134: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Помогите пожалуйста написать код в ассемблере. ...
Консультация # 189135: Здравствуйте! Прошу помощи в следующем вопросе: Помогите написать код программы на языке ассемблер для решения данного уравнения Заранее спасибо!...
Консультация # 189136: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Может кто помочь написать комментарий к этой программе
Код (Assembler) :: выделить код
model sma
...
Консультация # 189137: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Рассчитать и вывести значение выражение, при заданных пользователем значениях x и a ...
Консультация # 189138: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Вычислить значения в уравнение. Ассемблер TASM. Платформа Windows. ...
Консультация # 189139: У важаемые эксперты! Пожалуйста, ответьте на вопрос: Доброго времени суток. Мне нужна ваша помощь! Суть задачи заключается в реализации знакового умножения. Задача: Даны два числа в двоичном виде(a: 10110101b; b: 00110111b). Обнулить в первом числе 3,5,6 разряды и разделить полученное на 8, второе умножить на 2 и логически сложить с пер...

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

Здравствуйте! У меня возникли сложности с таким вопросом:
Помогите написать код на языке ассемблера для решения данного уравнения

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


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

Здравствуйте, vitya-titya!
Программа считает в целых числах.
Вся эта дробь из-за того, что отбрасываются остатки, сводится к 0
Результат -34

Код (Assembler) :: выделить код
	.model	small
	.data	 
;числа-константы из формулы
C123	dw	123
C4	dw	4
C5	dw	5
C6	dw	6
C3	dw	3
C36	dw	36 
C34	dw	34

sRes	db	10,13,'Result: $' 

	.stack	100h		;стек

	.code 			;сегмент кода
start:	mov	ax, @data 
	mov	ds, ax		;настраиваем сегментный регистр данных 

	mov	ax, С123	;ax=123
	sub	ax, C4		;ax=123-4
	cwd			;готовимся к делению
	idiv	C5		;ax = dx:ax/5 = (123-4)/5, остаток в dx отбрасываем
	mov	di, ax		;сохраним в di 
	
	mov	ax, C6		;ax=6
	sub	ax, C3		;ax=6-3
	cwd			;готовимся к делению
	idiv	C4		;ax = dx:ax/4 = (6-3)/4, остаток в dx отбрасываем
	add	di, ax		;di = (123-4)/5 + (6-3)/4
	
	mov	ax, C4		;ax = 4
	imul	C3		;dx:ax = 4*3, dx=0 отбрасываем
	add	ax, C36		;ax = 4*3 + 36
	
	xchg	ax, di		;меняем содержимое ax и di
	cwd			;готовимся к делению
	idiv	di		;ax = ((123-4)/5 + (6-3)/4) / (4*3 + 36), остаток отбрасываем
	
	sub	ax, C34		;ax = ax - 34

;выведем результат из 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
end	start

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

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

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

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Помогите пожалуйста написать код в ассемблере.

Дата отправки: 09.04.2016, 10:15
Вопрос задал: shenae2009 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, shenae2009!
Вот и программа... smile

Код (Assembler) :: выделить код
	.model	small
	.data	 
;числа-константы из формулы
C24	dw	34
C4	dw	4
C5	dw	5
C6	dw	6
C36	dw	36
C37	dw	37 
C8	dw	8
C3	dw	3
C2	dw	2

sRes	db	10,13,'Result: $' 

	.stack	100h		;стек

	.code 			;сегмент кода
start:	mov	ax, @data 
	mov	ds, ax		;настраиваем сегментный регистр данных 

	mov	ax, С24		;24
	mov	bx, C4		;4
	xor	dx, dx		;готовимся к делению
	idiv	bx		;ax = dx:ax/bx = 24/4, остаток в dx отбрасываем
	mov	di, ax		;сохраним в di 
	
	mov	ax, C5		;5
	imul	C6		;dx:ax = 5*6
	add	ax, di		;dx:ax = 5*6 + 24/4
	adc	dx, 0		;на всякий случай, учтем перенос
	div	C36		;ax = dx:ax / 36
	mov	di, ax		;сохраним в di, остаток отбрасываем

;посчитаем вторую половину формулы	
	mov	ax, C8		;8
	imul	C6		;dx:ax = 8*6
	add	ax, C5		;dx:ax = 8*6 + 5
	adc	dx, 0		;учитываем возможный перенос
	div	C3		;ax = dx:ax / 3
	mov	si, ax		;сохнаним частное, остаток в dx отбрасываем
	
	mov	ax, C3		;3
	imul	C2		;dx:ax = 3*2, старшее слово отбрасываем
	add	si, ax		;si = (8*6+5)/3 + 3*2
	
	mov	ax, C8		;8
	xor	dx, dx		;dx:ax = 8
	div	C2		;ax = dx:ax / 2, остаток в dx отбрасываем
	add	ax, C3		;ax = 8/2 +3
	imul	C37		;dx:ax = 37 * (8/2 +3)
	
	idiv	si		;ax = dx:ax / si = (37 * (8/2 +3)) / ((8*6+5)/3 + 3*2)
	
	add	ax, di		;в ax окончательный резльтат

;выведем результат
	mov	bx, 10		;система счисления 
	xor	cx, cx		;счетчик в стеке 
div_loop:
	xor	dx,dx 
	div	bx		;получаем младшую цифру 
	push	dx		;запоминаем в стеке 
	inc	cx		;считаем 
	test	ax,ax		;повторяем пока не ноль в ах 
	jnz	div_loop
	
	mov	ah, 9 
	lea	dx, sRes
	int	21h		;выводим сообщение 
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
end	start

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

5
Спасибо большое, очень выручили!
-----
Дата оценки: 11.04.2016, 11:36

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

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

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

Здравствуйте! Прошу помощи в следующем вопросе:
Помогите написать код программы на языке ассемблер для решения данного уравнения
Заранее спасибо!

Дата отправки: 09.04.2016, 10:22
Вопрос задал: vitya-titya (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, vitya-titya!

Смотрите приложение:

Код (Assembler) :: выделить код
model	small
data
dbRes	db	10,13,'Result:$'
a	dw	2
b	dw	3
c	dw	4
d	dw	5
e	dw	6
f	dw	8
g	dw	12
h	dw	14
i	dw	25
j	dw	36
k	dw	37
l	dw	250
stack	100h
code
org	100h
start:	mov	ax,@data
	mov	ds,ax;
	mov	ah,9
	lea	dx,dbRes;
	int	21h
	mov	di,a;2
	add	di,b;2+3
	shr	di,1;(2+3)/2
	mov	si,j;36
	sub	si,c;36-4
	mov	ax,c;4
	xor	dx,dx
	mul	e;4*6
	mov	bx,ax
	mov	ax,i;25
	xor	dx,dx
	mul	d;25*5
	add	ax,bx;(4*6+25*5)
	div	si;(4*6+25*5)/(36-4)
	add	di,si;(2+3)/2+(4*6+25*5)/(36-4)
	mov	ax,l;250
	shl	ax,2;250*2
	sub	ax,h;250-14
	div	k;(250-14)/37
	xchg	di,ax;
	div	di
	mov	di,ax;((2+3)/2+(4*6+25*5)/(36-4))/((250-14)/37)
	mov	ax,g;12
	sub	ax,c;12-4
	mov	si,k;37
	sub	si,f;37-8
	mul	si;(12-4)*(37-8)
	add	ax,di
	xor	cx,cx
	mov	di,10
@@01:	xor	dx,dx;
	div	di
	push	dx;
	inc	cx;
	or	ax,ax;
	jnz	@@01
@@02:	pop	ax;
	add	al,'0';
	int	29h
	loop	@@02
	mov	ah,4Ch;
	int	21h
	end	start

ps:вопросы задавайте в мини-форуме.
Удачи!

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 13.04.2016, 12:13
Рейтинг ответа:

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

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

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Может кто помочь написать комментарий к этой программе

Код (Assembler) :: выделить код
model small
code
szRow equ 6
szCol equ szRow
start: mov ax,@data
	mov ds,ax
	mov ch,szRow+1
	xor dx,dx
	xor bx,bx
lRow: mov cl,szCol+1
	xor di,di
lCol: cmp cl,ch
	jle next
	mov al,mass[bx][di]
	test al,80h
	jnz next
	cbw	
	add dx,ax
next: inc di
	dec cl
	jnz lCol
	add bx,szCol
	dec ch
	jnz lRow
	mov sum,dx
	mov ah,4ch
mov ah,1
	int 21h
data
sum dw ?
mass label byte
dat = 0
	rept	szRow
	rept	szCol
	db dat
dat = (dat+szRow*szCol)mod 256
	endm
 endm
stack 256
  end start

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


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

Здравствуйте, Dron!
1) Комментариев сделал не просто много, а неприлично много smile
2) Ошибочки таки есть: неправильно задавались счетчики строк и столбцов и неправильно задавалась функция выхода из программы smile

Код (Assembler) :: выделить код
	model	small		;модель памяти
	.code			;сегмент кода

szRow	equ	6		;число строк матрицы
szCol	equ	szRow		;колонок столько же, матрица квадратная

start:	mov	ax, @data	;адрес сегмента данных в памяти
	mov	ds, ax		;инициируем регистр сегмента данных
	
;далее идет подсчет суммы положительных элементов матрицы, 
;расположенных ниже главной диагонали
	mov	ch, szRow	;число строк
	xor	dx, dx		;здесь будем накапливать сумму
	xor	bx, bx		;база очередной строки матрицы
lRow:	mov	cl, szCol	;цикл по строкам, число колонок в строке
	xor	di, di		;индекс колонки в строке
lCol:	cmp	cl, ch		;элементы на главной диагонали и выше
	jle	next		; пропускаем
	mov	al, mass[bx][di];берем элемент bx строки di столбца
	test	al, 80h		;отрицательное число?
	jnz	next		;рассматриваем только положительные числа
	cbw			;байт превращаем в слово
	add	dx, ax		;складываем
next:	inc	di		;на следующий элемент в строке
	dec	cl		;уменьшаем счетчик колонок
	jnz	lCol		;на следующую колонку строки
	add	bx, szCol	;строка закончилась, смещаем базу строки на длину строки
	dec	ch		;уменьшаем счетчик строк
	jnz	lRow		;на следующую строку
	mov	sum, dx		;строки кончились, сохраняем результат
	mov	ah, 4ch		;ф-я завершения программы
	mov	al, 1		;код возврата
	int	21h
	
	.data			;сегмент данных
sum	dw	?		;здесь будет сумма
mass	label	byte		;матрица szRow на szCol элементов
				;далее задается содержимое матрица при помощи макро
dat 	= 0			;начальное значение данных
rept	szRow			;внешний цикл, повтор szRow раз
rept	szCol			;внутренний цикл, повтор szCol раз
	db	dat		;байт, равный переменной dat
dat 	= (dat+szRow*szCol)mod 256	;следующее значение равно 
					;остатку от деления на 256 от суммы 
					;предыдущего значения и szRow*szCol=36
					;т.о., в матрице будут числа
					;0, 36, 72, 108, 144, 180, 216, 252, 32, 72 и т.д.
					;числа рассматриваются, как знаковые.
					;т.е., если 0 <= число < 128, то положительное
					;если 128 <= число < 256, то отрицательное, в доп коде
endm				;конец внутреннего цикла
endm				;конец внешнего цикла

	.stack	256		;стек 100h байт
	end	start		;точка входа в программу

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

5
нет комментария
-----
Дата оценки: 09.04.2016, 22:08

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

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

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

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Рассчитать и вывести значение выражение, при заданных пользователем значениях x и a

Дата отправки: 09.04.2016, 10:30
Вопрос задал: ya.fynjygh2013 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, ya.fynjygh2013!
Вот Вам программа.
Все вычисления производятся с вещественными числами.

Код (Assembler) :: выделить код
	.model	small
	.data
sEnterA	db	"Enter a = $"	;приглашение ввести а
sEnterX	db	"Enter x = $"	;приглашение ввести х
sY	db	"y = $"		;вывод y
				;числа-константы из формулы
c10	dw	10		; 10 - кроме того, основание системы счисления
c17	dw	17
c4	dw	4
c5	dw	5
c8	dw	8
c3	dw	3
c14	dw	14
c16	dw	16
c6	dw	6
				;буфер для ввода строки-вещественного числа
max	db	64		;размер буфера
len	db	?		;реальная длина
String	db	64 dup (?)	;сама строка

sTemp	db	64 dup(?)	;временный буфер для формирования строки-числа
dig	dw	?		;цифра при обмене с сопроцессором

a	dd	?		;числа, которые вводятся
x	dd	?

	.code			;сегмент кода
	.386			;необходимо для команды fsin
	.startup		;инициализация сегментов для выбранной модели памяти

	lea	dx, sEnterA
	call	InputFloat	;вводим а
	fstp	a		;сохраним из стека сопроцессора в переменной а

	lea	dx, sEnterX
	call	InputFloat	;вводим х
	fstp	x

	lea	dx, sY		;выведем строку "y = "
	mov	ah, 9
	int	21h

	call	CalcY		;считаем y по формуле, результат в стеке сопроцессора

	call	float2str	;преобразуем вещ число в стеке сопроцессора в строку

	lea	dx, String	;и выведем
	mov	ah, 9
	int	21h

	mov	ah, 0		;ждем нажатие на клавишу
	int	16h
	.exit	0

CalcY	proc			;расчет по формуле
	fild	C17		;17
	fimul	C4		;17*4

	fld	a		;a
	fimul	C5		;a*5
	fild	C8		;8
	fidiv	C3		;8/3
	fsubp			;a*5 - 8/3

	fld	x		;x
	fsin			;sin(x)
	fimul	C14		;14*sin(x)
	fiadd	C5		;14*sin(x)+5
	fidiv	C4		;(14*sin(x)+5)/4

	fild	C16		;16
	fimul	C6		;16*6
	fiadd	C5		;16*6 + 5
	fidiv	C10		;(16*6 + 5)/10
	faddp			;(14*sin(x)+5)/4 + (16*6 + 5)/10 
	fdivp			;(a*5 - 8/3) / ((14*sin(x)+5)/4 + (16*6 + 5)/10)
	faddp			;17*4 + (a*5 - 8/3) / ((14*sin(x)+5)/4 + (16*6 + 5)/10)
	ret
CalcY	endp

InputFloat	proc		;ввод вещественного числа
	push	dx		;сохраним адрес приглашения для повторного ввода
	mov	ah, 9		;выведем строку приглашения
	int	21h
	
	lea	dx, max		;вводим строку
	mov	ah, 0ah
	int	21h

	lea	si, String	;адрес строки
	call	str2float	;преобразовываем во float с проверкой синтаксиса
	pushf			;флаг С говорит о корректности строки, сохраним флажки
	mov	ah, 2
	mov	dl, 0dh		;перевод на новую строку
	int	21h
	mov	dl, 0ah
	int	21h
	popf			;восстановим флажки
	pop	dx		;восстановим (уберем из стека) адрес приглашения
	jc	InputFloat	;ошибка - на повтор ввода!
	ret			;введенное число в стеке сопроцессора
InputFloat	endp
	
;Преобразование строки в вещественное число в st сопроцессора
str2float	proc		;преобразование строки в вещественное число
	fldz			;подготовим st=0
	xor	dx, dx		;число знаков после точки = 0
	xor	bx, bx		;bl = 0/1 знак числа +/-, bh = 1/0 знак уже введен/не задан
	xor	di, di		;число введенных цифр, для контроля позиции знака
s2fNext:
	lodsb			;очередной символ
	cmp	al, 0dh		;дошли до конца?
	je	s2fSign		;учтем знак
	cmp	al, '+'		;плюс?
	jne	s2f_minus
	cmp	bh, 0		;знак уже был введен?
	jne	s2f_err		;можно только раз
	test	di, di
	jne	s2f_err		;знак можно писать только в первой позиции
	mov	bh, 1		;знак задан
	jmp	s2fNext
s2f_minus:
	cmp	al, '-'		;минус?
	jne	s2f_point
	cmp	bh, 0		;знак уже был введен?
	jne	s2f_err		;можно только раз
	test	di, di
	jne	s2f_err		;знак можно писать только в первой позиции
	mov	bx, 0101h	;задаем знак - минус
	jmp	s2fNext
s2f_point:
	cmp	al, '.'		;точка
	jne	s2f_digit
	test	dx, dx		;точку можно задать только один раз
	jne	s2f_err
	jmp	s2fInc
s2f_digit:			;проверка на цифры
	cmp	al, '0'
	jb	s2f_err
	cmp	al, '9'
	ja	s2f_err	
	inc	di		;есть цифра
	and	ax, 0fh		;готовим разряд 
	mov	dig, ax		; для загрузки в сопроцессор
	test	dx, dx		;если целая часть, то
	je	s2fMul10	; на умножение на 10
	mov	cx, dx		;иначе делим dx раз на 10
	fild	dig		; очередной разряд
s2fdiv:
	fidiv	c10		;делим dх раз
	loop	s2fdiv
	faddp			;складываем разряд за точкой с формируемым числом
s2fInc:
	inc	dx		;для точки только увеличиваем dх
	jmp	s2fNext		;пока не дойдем до конца

s2fMul10:			;целое число
	fimul	c10		;умножаем старое на 10
	fiadd	dig		;и прибавляем очередной разряд
	jmp	s2fNext
s2fSign:			;ввод числа закончен, учтем знак
	cmp	bl, 0		;если -
	je	s2fRet
	fchs			;то меняем знак
s2fRet:
	clc			;все ок
	ret
s2f_err:
	stc			;ошибочка
	fstp	st		;выкидаем из стека число
	ret
str2float	endp

;преобразование вещественного числа из st в строку по адресу String
float2str	proc
	push	es
	push	ds
	pop	es		;es=ds

	lea	di, sTemp	;здесь будем формировать строку
	ftst			;Проверяем число
	fstsw   ax		;флаги в ax
	sahf			;флаги в регистре флагов
	jnz	f2s_notZero	;не 0
	mov	dx, 1		;длина 1
	mov	bl, 0		;сбрасываем знак
	mov	ax, '0'		;если 0, то выводим 0
	stosw
	jmp	f2s_Ret		;на выход

f2s_notZero:			;не 0
	mov	al, ' '		; пока считаем, что положительное
	jnc	f2s_sign	;если оно отрицательное,
	mov	al, '-'		; то минус
	fchs			; и оставляем модуль числа.
f2s_sign:
	stosb			;знак числа
; Пояснение далее пойдёт на примере.	; ST(0) ST(1) ST(2) ST(3) ...
; Отделим целую часть от дробной.	; 73.25 ... что-то не наше
	fld1				;  1	73.25 ...
	fld	st(1)			; 73.25  1    73.25 ...
; Остаток от деления на единицу даст дробную часть.
	fprem				;  0.25  1    73.25 ...
; Если вычесть её из исходного числа, получится целая часть.
	fsub	st(2), st		;  0.25  1    73    ...
	fxch	st(2)			; 73     1     0.25 ...
; Сначала поработаем с целой частью. Считать количество цифр будем в CX.
	xor	cx, cx
; Поделим целую часть на десять,
f2s_2:	fidiv	c10			;  7.3   1     0.25 ...
	fxch	st(1)			;  1	 7.3   0.25 ...
	fld	st(1)			;  7.3	 1     7.3  0.25 ...
; отделим дробную часть - очередную справа цифру целой части исходного числа,-
	fprem				;  0.3	 1     7.3  0.25 ...
; от чатсного оставим только целую часть
	fsub	st(2), st		;  0.3	 1     7    0.25 ...
; и сохраним цифру
	fimul	c10			;  3	 1     7    0.25 ...
	fistp	dig			;  1	 7     0.25 ...
	inc	cx
; в стеке.
	push	dig
	fxch	st(1)			;  7	 1     0.25 ...
; Так будем повторять, пока от целой части не останется ноль.
	ftst
	fstsw	ax
	sahf
	jnz	f2s_2
; Теперь выведем её.
f2s_3:	pop	ax
; Вытаскиваем очередную цифру, переводим её в символ и выводим.
	add	al, 30h
	stosb
; И так, пока не выведем все цифры.
	loop	f2s_3		  	;  0	 1     0.25 ...
; Итак, теперь возьмёмся за дробную часть, для начала проверив её существование.
	fstp	st(0)			;  1	 0.25 ...
	fxch	st(1)		 	;  0.25  1    ...
	ftst
	fstsw	ax
	sahf
	jz	f2s_5
; Если она всё-таки ненулевая, выведем точку
	lea	ax, sTemp
	mov	cx, di
	sub	cx, ax
	sub	cx, 63
	neg	cx
	mov	al, '.'
	stosb
; Помножим дробную часть на десять
f2s_4:	fimul	c10			;  2.5	 1    ...
	fxch	st(1)			;  1	 2.5  ...
	fld	st(1)		 	;  2.5	 1     2.5  ...
; отделим целую часть - очередную слева цифру дробной части исходного числа,-
	fprem				;  0.5	 1     2.5  ...
; оставим от произведения лишь дробную часть
	fsub	st(2), st		;  0.5	 1     2    ...
	fxch	st(2)		 	;  2	 1     0.5  ...
; сохраним полученную цифру во временной ячейке
	fistp	dig			;  1	 0.5  ...
; и сразу выведем.
	mov	ax, dig
	add	al, 30h
	stosb
; Теперь, если остаток дробной части ненулевой
	fxch	st(1)			;  0.5	 1    ...
	ftst
	fstsw	ax
	sahf
; и мы вывели менее cx цифр, продолжим
	loopnz  f2s_4		 	;  0	 1    ...
; Итак, число выведено. Осталось убрать мусор из стека.
f2s_5:	fstp	st(0)			;  1	...
	fstp	st(0)			;  ...
	mov	byte ptr [di], '$'	;закроем строку знаком '$' для функции 9
; и скопировать в буфер String не более 14 знаков
	lea	si, sTemp
	lea	di, String
	mov	dx, 0		;длина
f2s_6:
	lodsb
	stosb				;копируем 1 байт
	inc	dx			;считаем
	cmp	dx, 14			;копируем только 14 байт !!! (если получится число
					; с большим чем 14 байт знаков, то последние усекутся)
	je	f2s_7			;насильно закрываем '$'!
	cmp	al, '$'
	jne	f2s_6			;копирование завершаем по '$'
	dec	dx			;отнимем 1 (посчитался байт '$')
f2s_7:
	mov	byte ptr [di], '$'	;закроем '$' (для случая обрезания)
f2s_Ret:
	pop	es
	ret
float2str	endp
	end

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

5
нет комментария
-----
Дата оценки: 13.04.2016, 08:43

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

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

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

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Вычислить значения в уравнение. Ассемблер TASM. Платформа Windows.


Дата отправки: 09.04.2016, 10:31
Вопрос задал: vsib2012 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, vsib2012!
Исправленная программа
Посмотрите сначала самостоятельно.
Если будет что-то непонятно, потом напишу комментарии

Код (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,49 		;ax = 49
	mov	bx,7 
	cwd 			;dx:ax = 49
	idiv	bx 		;ax = dx:ax / bx = 49 / 7, остаток dx игнорируем
	mov	si,ax 		;сохраним в si

	mov 	ax,42 		;ax = 42
	mov 	bx,6 
	cwd 			;dx:ax = 42
	idiv 	bx 		;ax = dx:ax / bx = 42 / 7, остаток dx игнорируем
	add 	si,ax 		;si = 49/7 + 42/7

	mov 	ax,6 		;ax = 6
	mov 	bx,2
	imul 	bx 		;dx:ax = 6*2, старшее слово в dx игнорируем
	add 	si,ax 		;si = 49/7 + 42/7 + 6*2

	mov 	ax,8 		;ax = 8
	mov 	bx,5 
	mul 	bx 		;dx:ax = 8*5
	mov 	bx,9 
	idiv 	bx 		;ax = 8*5/9, остаток dx игнорируем
	mov 	di,ax 		;сохраним в di

	mov 	ax,4 		;ax = 4
	mov 	bx,6 
	imul 	bx 		;dx:ax = 4*6, старшее слово в dx игнорируем
	sub 	di,ax 		;di = 8*5/9 - 4*6

	mov	ax,si		;ax = 49/7 + 42/7 + 6*2
	cwd			;dx:ax = 49/7 + 42/7 + 6*2
	div 	di 		;ax = (49/7 + 42/7 + 6*2) / (8*5/9 - 4*6), остаток dx игнорируем

	mov	si, ax		;сохраним в si

	mov 	ax,23 		;ax = 23
	add 	ax,12 		;ax = 23+12
	mov 	bx,26 		;bx = 26
	sub 	bx,4 		;bx = 26-4
	cwd			;dx:ax = 23+12
	div 	bx 		;ax = (23+12)/(26-4), остаток dx игнорируем

	mov 	bx,5 
	mul 	bx 		;dx:ax = ((23+12)/(26-4))*5

	add	ax, si		;ax = ((49/7+42/7+6*2)/(8*5/9-4*6))+((23+12)/(26-4))*5
	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

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

5
нет комментария
-----
Дата оценки: 12.04.2016, 16:50

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

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

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

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Доброго времени суток. Мне нужна ваша помощь!
Суть задачи заключается в реализации знакового умножения.
Задача:
Даны два числа в двоичном виде(a: 10110101b; b: 00110111b). Обнулить в первом числе 3,5,6 разряды и разделить полученное на 8, второе умножить на 2 и логически сложить с первым. Результат проинвертировать.
Предпочтителен TASM. Модель памяти значения не имеет. Платформа: ОС Wiondows.
Уважаемые эксперты, заранее спасибо!)

Дата отправки: 09.04.2016, 10:35
Вопрос задал: nordhard (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, nordhard!

Смотрите приложение:

Код (Assembler) :: выделить код
model	tiny
code
org	100h
start:	mov	al,10110101b;А
	mov	bl,00110111b;В
	and	al,10010111b;обнуляем биты младший разряд нулевой
	mov	cl,3;число сдвигов
	shr	al,cl;сдвигает, т.е. делим
	shl	bl,1;сдвиггаем, т.е. умножаем
	or	bl,al;логически суммируем
	mov	cx,8;будем выводить 8-мь бит
@@01:	xor	al,al;сбрасываем
	shl	bl,1;сдвигаем в CF бит
	adc	al,'0';переводим в символ
	int	29h;выводим
	loop	@@01;в цикле
	ret;выход
	end	start


Удачи!

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 12.04.2016, 08:46

5
нет комментария
-----
Дата оценки: 12.04.2016, 19:52

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

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


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

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

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


В избранное