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

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


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

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

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

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

Номер выпуска:1594
Дата выхода:14.04.2016, 09:51
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:17 / 8
Вопросов / ответов:3 / 3

Консультация # 189124: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Написать программу на ассемблере, для решения данного уравнения Программная реализация на TASM, DOS, формат ехе....
Консультация # 189125: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Доброго времени суток, уважаемые эксперты! Мне нужна ваша помощь! Суть задания заключается в следующем: реализовать программу со строками. Слова в строке могут быть разделены пробелами и знаками препинания. Удалить в каждом слове строки повторяющиеся в нем буквы. Помогите, пожалуйста. ...
Консультация # 1 89126: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите написать программу на языке ассемблер, для решения уравнения ...

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

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

Написать программу на ассемблере, для решения данного уравнения
Программная реализация на TASM, DOS, формат ехе.

Дата отправки: 08.04.2016, 13:07
Вопрос задал: nikolan2012 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

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

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

Код (Assembler) :: выделить код
model	small
data
a	dw	34
b	dw	260	
c	dw	2
d	dw	170
e	dw	3
f	dw	36
g	dw	8
h	dw	5
i	dw	6
j	dw	7
dbRes	db	10,13,'Result:$'
stack	100h
code
start:	mov	ax,@data
	mov	ds,ax;настраиваем сегмент
;получаем знаменатель
	mov	ax,h;загружаем 5
	xor	dx,dx;
	mul	i;умножаем на 6
	mov	bx,f;загружаем 36
	add	bx,g;суммируем с 8
	shr	bx,1;делим на 2
	add	bx,ax;суммируем (36+8)/2+5*6
;
	mov	ax,d;загружаем 170
	xor	dx,dx
	mul	e;умножаем на 3
	mov	cx,b;загружаем 260
	shr	cx,1;делим на 2
	add	ax,cx;суммируем 170*3+260/2
	add	ax,a;суммируем 34+170*3+260/2
;
	xor	dx,dx
	div	bx;получаем первую дробь
;(34+170*3+260/2)/((36+8)/2+5*6)
	push	ax;сохраняем в стеке
;
	mov	ax,i;загружаем 6
	add	ax,j;суммируем с 7
	mov	si,a;загружаем 34
	shr	si,1;делим на 2
	xor	dx,dx
	mul	si;получаем второе число
	pop	bx;востанавливаем первое число
	add	ax,bx;суммируем
;
	mov	si,10;система счисления
	xor	cx,cx;счетчик в стеке
@@01:	xor	dx,dx
	div	si;получаем младшую цифру
	push	dx;запоминаем в стеке
	inc	cx;считаем
	or	ax,ax;повторяем пока не ноль в ах
	jnz	@@01
	mov	ah,9
	lea	dx,dbRes
	int	21h;выводим сообщение
@@02:	pop	ax;извлекаем цифру
	add	al,'0';переводим в символ
	int	29h;выводим на экран
	loop	@@02
	xor	ax,ax;ожидаем любую клавишу
	int	16h
	mov	ah,4Ch;выход
	int	21h
end	start

Комментариев достаточно, если что спрашивайте в мини-форуме.
Удачи!

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

5
Спасибо, все работает!
-----
Дата оценки: 09.04.2016, 10:10

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

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

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

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Доброго времени суток, уважаемые эксперты! Мне нужна ваша помощь!
Суть задания заключается в следующем:
реализовать программу со строками. Слова в строке могут быть разделены пробелами и знаками препинания. Удалить в каждом слове строки повторяющиеся в нем буквы.
Помогите, пожалуйста.
Буду очень благодарен за помощь. Добра и позитива!

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


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

Здравствуйте, Maxim!
Где-то так... Идея такая:
1) ищем слова, состоящие из латинских букв. Все остальное - разделители
2) обнуляем в каждом слове одинаковые буквы
3) сжимаем строку, удаляя из нее нули
Комментариев более чем достаточно. Смотрите. С вопросами - в мини-форум smile

Код (Assembler) :: выделить код
;реализовать программу со строками. 
;слова в строке могут быть разделены пробелами и знаками препинания. 
;удалить в каждом слове строки повторяющиесЯ в нем буквы.

	.model	small
	.data
;структура для ввода строки по функции 0ah
max	db	80		;максимальная длина строки
len	db	0		;реальная длина введенной строки
string	db	80 dup (0)	;сама строка, заканчивается кодом 0dh

sEnter		db	'Enter string: $'
sResult		db	0dh,0ah,'Result      : $'
sAny		db	0dh,0ah,'Press any key$'

	.code
start:
	mov	ax, @data	;настроим сегментные регистры
	mov	ds, ax
	mov	es, ax

;ввод строки
;введенная строка в структуре max,len,string
	call	EnterString

;решаем задачу	
	call	DelRepeats

;выводим преобразованную строку	
	lea	dx, sResult	;выведем Result:
	mov	ah, 9
	int	21h

	lea	dx, string	;строка
	mov	ah, 9
	int	21h
	
Exit:				;выход
	lea	dx, sAny
	mov	ah, 9
	int	21h

	mov	ah, 0		;подождем нажатия на любую клавишу
	int	16h

	mov	ax, 4c00h
	int	21h

EnterString	proc		;ввод строки
	lea	dx, sEnter	;выведем приглашение
	mov	ah, 9
	int	21h

	lea	dx, max		;вводим строку
	mov	ah, 0ah
	int	21h
	ret
EnterString	endp

isLetter	proc		;проверка на букву
	cmp	al, 'A'		;считаем, что буквы - только английские!
	jb	not_letter	; большие и маленькие
	cmp	al, 'Z'
	jbe	letter
	cmp	al, 'a'
	jb	not_letter
	cmp	al, 'z'
	ja	not_letter
letter:
	inc	bp		;помечаем, что найдена буква очередного слова
	stc			;помечаем, что буква
	ret
not_letter:
	clc			;не буква
	ret
isLetter	endp

;поиск и обнуление повторяющихся букв в слове
;BX - адрес начала слова
;SI - адрес за словом
isRepeat	proc		
	test	bp, bp		;было ли слово?
	jne	isRepeat_ext_loop
	ret			;повтор разделителей, которые не трогаем
isRepeat_ext_loop:		;будем искать все буквы слова с начала слова
				; во всех последующих
	cmp	bx, si		;дошли до конца слова?
	jae	isRepeat_ret	;на выход
	mov	al, [bx]	;очередная буква
	cmp	al, 0		;уже обнуленную пропускаем
	je	isRepeat_ext_next
	lea	di, [bx+1]	;со следующего адреса
isRepeat_int_loop:
	cmp	di, si		;до конца слова
	jae	isRepeat_ext_next
	cmp	al, [di]	;сравниваем
	jne	isRepeat_int_next
	mov	byte ptr[bx], 0	;одинаковые обнуляем!
	mov	byte ptr[di], 0
isRepeat_int_next:
	inc	di		;на следующий адрес
	jmp	isRepeat_int_loop
isRepeat_ext_next:
	inc	bx		;на адрес следующей буквы, которую будем искать
	jmp	isRepeat_ext_loop
isRepeat_ret:
	xor	bp, bp		;сбросим флаг найденного слова
	ret
isRepeat	endp

DelZeros	proc		;сожмем строку, выбросим все нулевые байты
	lea	si, string	;адрес начала строки
DelZeros_loop:
	mov	al, [si]
	inc	si
	cmp	al, '$'
	je	DelZeros_ret	;дошли до конца строки
	cmp	al, 0
	jne	DelZeros_loop	;ненулевые обходим
	mov	di, si		;адрес за нулевым байтом
DelZeros_shift_loop:		;сдвигаем строку на одну букву назад
	mov	al, [di]	;тем самым затираем нуль
	mov	[di-1], al
	inc	di
	cmp	al, '$'		;до конца строки
	jne	DelZeros_shift_loop
	dec	si		;на одну букву сдвинули назад, поэтому надо проверить
				;  символ на позиции бывшего нуля
	jmp	DelZeros_loop	;на проверку очередного символа
DelZeros_ret:
	ret
DelZeros	endp

DelRepeats	proc		;удаление букв, которые повторяются в словах 
	lea	si, string	;адрес начала строки
	xor	bx, bx		;вставим в конец строки символ '$' (для функции 9)
	mov	bl, len		;длина строки
	mov	[bx+si], byte ptr '$'
	xor	bp, bp		;флаг отсутствия слова
words_loop:			;цикл по словам
	mov	bx, si		;запоминаем начало слова
word_loop:			;поиск слова
	mov	al, [si]
	inc	si
	cmp	al, '$'		;дошли до конца
	je	DelRepeat_ret
	call	isLetter	;буква?
	jc	word_loop	;да - ищем небукву
				;нет - конец слова
	dec	si		;si - адрес за разделителем, уменьшим на 1
				; чтобы был адрес за словом
	call	isRepeat	;обнуляем повторы букв в слове (если они есть)
	inc	si		;адрес - за первым разделителем
	jmp	words_loop	;на поиск следующего слова
DelRepeat_ret:			;в конце надо еще проверить на наличие слова перед '$'
	dec	si
	call	isRepeat	;проверяем последнее слово
	call	DelZeros	;удаляем нулевые байты в строке
	ret
DelRepeats	endp

	end	start		;точка входа

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

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

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

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

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

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

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


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

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

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

Код (Assembler) :: выделить код
model   small
data
a	dw	123
b	dw	4
c	dw	6
d	dw	3
e	dw	5
f	dw	36
g	dw	34
dbRes   db   10,13,'Result:$' 
stack   100h
code 
start:   mov   ax,@data 
   mov   ds,ax;настраиваем сегмент
;считаем числитель дроби числителя
	mov	ax,a;
	sub	ax,b;
	xor	dx,dx
	mul	b;(123-4)*4
	push	ax
	mov	ax,c;
	sub	ax,d;
	xor	dx,dx;
	mul	e;(6-3)*5
	pop	bx
	add	bx,ax;
;считаем знаменатель дроби числителя
	mov	ax,b
	xor	dx,dx
	mul	e;5*4
	xchg	ax,bx
	xor	dx,dx
	div	bx;((123-4)*4+(6-3)*5)/(5*4)
	mov	bx,ax
;считаем знаменатель
	mov	ax,b;
	xor	dx,dx;
	mul	d;4*3
	add	ax,f;36+4*3
	xchg	bx,ax;
	div	bx;((123-4)*4+(6-3)*5)/(5*4))/(36+4*3)
	sub	ax,g;((123-4)*4+(6-3)*5)/(5*4))/(36+4*3)-34
;
	xor	di,di
	test	ax,8000h
	jz	@@00
	mov	di,1
	not	ax
	inc	ax
@@00:	mov	si,10;система счисления 
	xor	cx,cx;счетчик в стеке 
@@01:	xor	dx,dx 
	div	si;получаем младшую цифру 
	push	dx;запоминаем в стеке 
	inc	cx;считаем 
	or	ax,ax;повторяем пока не ноль в ах 
	jnz	@@01 
	mov	ah,9 
	lea	dx,dbRes
	int	21h;выводим сообщение 
	or	di,di
	jz	@@02
	mov	al,'-'
	int	29h
@@02:	pop	ax;извлекаем цифру 
	add	al,'0';переводим в символ 
	int	29h;выводим на экран 
	loop	@@02 
	xor	ax,ax;ожидаем любую клавишу 
	int	16h
	mov	ah,4Ch;выход 
	int	21h
end   start

Удачи!

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

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


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

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

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


В избранное