Помощь - Поиск - Пользователи - Календарь
Полная версия: Требуется вывести оставшиееся дни недели после заданного и до заданного
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
NightMan665
Задача такая, нужно вывести все дни недели которые находяться после заданного числом дня и все дни которые идут заново, но до заданного дня, т. е. допустим

ВОС ПОН ВТО СРЕ ЧЕТ ПЯТ СУБ
задали число 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


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

.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
Пасиб большое, а этот код мы вырывали троём с одногруппниками из лекций, т.к. толком препод объяснить не может, хотя и очень хочет чтобы мы поняли, ну, приходиться получать зачоты как можем, это печально norespect.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.