IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Требуется вывести оставшиееся дни недели после заданного и до заданного
NightMan665
сообщение 4.03.2010 10:45
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Задача такая, нужно вывести все дни недели которые находяться после заданного числом дня и все дни которые идут заново, но до заданного дня, т. е. допустим

ВОС ПОН ВТО СРЕ ЧЕТ ПЯТ СУБ
задали число 3 - ВТО
должен вывести: ВТО СРЕ ЧЕТ ПЯТ СУБ ВОС ПОН
а выводит только: ВТО СРЕ ЧЕТ ПЯТ СУБ


.data?

	lpbuffer_output		db	64 dup(?)

.data

	sztitle			db	"Результат:  ",0

	szformat_month	db	0Dh, 0Ah, "%s", 0Dh, 0Ah, 0

;_____________________________________________________
three	db	4
monin	db	'02'
alfmon	db	'????', 0
montab	db	'ПОН ','ВТО ','СРЕ ','ЧЕТ ','ПЯТ ','СУБ ','ВОС '
;daytab  db	'ПОН ','ВТО ','СРЕ ','ЧЕТ ','ПЯТ ','СУБ ','ВОС '
;_____________________________________________________
.code

start:

; ============================= start ====================================
;title direct:  Прямой табличный доступ
;_____________________________________________________
main	proc

	xor eax,eax
	xor ebx,ebx
	xor edx,edx
	xor ecx,ecx
	xor esi,esi
	xor edi,edi

	call	c10conv	;получить двоичное значение
	call	d10loc	;выделить месяц из таблицы
	call	f10disp	;выдать месяц на экран
	ret
   	main	endp

;	перевод ASCII в двоичное представление
;	______________________________________
c10conv proc

	mov	ah,monin;загрузить номер месяца
	mov	al,monin+1
	xor	ax,3030h;удалить ASCII-тройки
	cmp	ah,0	;месяц 01-09?
	jz	c20	;да - обойти
	sub	ah,ah	;нет - очистить ah,
	add	al,10	;и перевести в двоичное
c20:	ret
c10conv	endp

;	выделение месяца из таблицы
;	___________________________
d10loc	proc

	lea	esi,montab
	dec	al	;коррекция для таблицы
	mul	three	;умножить al на 4
	add	si,ax
	mov	cx,70	;трехсимвольная пересылка
	cld
	lea	edi,alfmon
rep	movsb		;переслать 3 символа
	ret
d10loc	endp

;	вывод на экран названия месяца
f10disp proc
; output_message:
	push OFFSET alfmon	; вывод на экран имени месяца
	push OFFSET szformat_month; формат вывода на экран имени месяца
	push OFFSET lpbuffer_output
	call wsprintf

	push MB_OK
	push OFFSET sztitle
	push OFFSET lpbuffer_output
	push 0
	call MessageBox

	push 0
	call ExitProcess
	
f10disp	endp
end start


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 2)
volvo
сообщение 4.03.2010 14:06
Сообщение #2


Гость






Цитата
должен вывести: ВТО СРЕ ЧЕТ ПЯТ СУБ ВОС ПОН
а выводит только: ВТО СРЕ ЧЕТ ПЯТ СУБ
А ты компилятору где именно сказал, что он должен вывести и впереди идущую часть? Вот так, к примеру, работает:

.data?
	
	lpbuffer_output		db 128 dup(?)
	alfmon			db 64 dup(?)

.data
	sztitle db 'Результат:  ', 0
	szformat_month db 0Dh, 0Ah, '%s%s', 0Dh, 0Ah, 0
	
;_____________________________________________________
three	db 4
monin	db '06'
montab	db   ' ПОН',' ВТО',' СРЕ',' ЧЕТ',' ПЯТ',' СУБ',' ВОС', 0
;_____________________________________________________
.code

start:

; ============================= start
;title direct:  Прямой табличный доступ
;_____________________________________________________
main    proc

	xor eax,eax
	xor ebx,ebx
	xor edx,edx
	xor ecx,ecx
	xor esi,esi
	xor edi,edi
	
	call    c10conv    ; получить численное значение
	call    d10loc    ; выделить деньи ВСЕ СЛЕДУЮЩИЕ из таблицы
	call    f10disp    ; выдать результат на экран
	ret
	main    endp

;    перевод ASCII в двоичное представление
;    ______________________________________
c10conv proc

	mov    ah,monin;загрузить номер месяца
	mov    al,monin+1
	xor    ax,3030h;удалить ASCII-тройки
	cmp    ah,0    ;месяц 01-09?
	jz    c20    ;да - обойти
	sub    ah,ah    ;нет - очистить ah,
	add    al,10    ;и перевести в двоичное
c20:
	ret

c10conv    endp

;    выделение месяца из таблицы
;    ___________________________
d10loc    proc

	lea esi, montab
	dec al		; коррекция для таблицы
	mul three	; умножить al на 4
	jz ok		; ноль - ничего делать не надо, все нормально
	add esi, eax	; не ноль - настроить SI на начало нужного месяца
ok:
	; поскольку я переделал таблицу montab - надо пропустить пробел
	inc esi	
	mov byte ptr [esi - 1], 0	; а теперь ПЕРЕД нужным месяцем поставим 0
	
	; тут у тебя вообще был бред - ты 70 байт копировал непонятно куда
	; я копирую в другую строку нужный месяц и все следующие за ним,
	; до символа 0
	mov cx, 64
	cld
	lea edi, alfmon
	rep movsb
	
	ret
	
d10loc    endp

;    вывод на экран названия месяца
f10disp proc

	; output_message:
	; в моей версии wsprintf принимает не 1 строку, а две:
	; окончание таблицы, и ее начало. Теперь понятно, зачем
	; я туда, перед названием месяца, запихал 0? Правильно,
	; теперь я могу спокойно передать адрес начала таблицы,
	; и строка обрежется, как только этот ноль буде достигнут
	
	push offset montab
	push offset alfmon
	push OFFSET szformat_month	; формат вывода тоже изменен
	push OFFSET lpbuffer_output
	call wsprintf 
	
	; ну, все... Выводим результат
	push MB_OK
	push OFFSET sztitle
	push OFFSET lpbuffer_output
	push 0
	call MessageBox
	
	push 0
	call ExitProcess
    
f10disp    endp
end start


Вопрос на засыпку: а чего ты строки копируешь, как Unicode-ные, а выводишь MessageBox неЮникодный? Нехорошо...
 К началу страницы 
+ Ответить 
NightMan665
сообщение 7.03.2010 13:21
Сообщение #3





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Пасиб большое, а этот код мы вырывали троём с одногруппниками из лекций, т.к. толком препод объяснить не может, хотя и очень хочет чтобы мы поняли, ну, приходиться получать зачоты как можем, это печально norespect.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 27.07.2025 22:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"