![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() |
NightMan665 |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Задача такая, нужно вывести все дни недели которые находяться после заданного числом дня и все дни которые идут заново, но до заданного дня, т. е. допустим
ВОС ПОН ВТО СРЕ ЧЕТ ПЯТ СУБ задали число 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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Пасиб большое, а этот код мы вырывали троём с одногруппниками из лекций, т.к. толком препод объяснить не может, хотя и очень хочет чтобы мы поняли, ну, приходиться получать зачоты как можем, это печально
![]() |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 22:20 |