Вывод системной даты, времени и даты ближайшего воскресенья - Assembler
Формулировка задачи:
вот исходный код
выводит дату время
.Model Small .486p .Stack 100h .Data wNumOff DW 10 Dup(0) ;Смещение строки, где будет содержаться печатаемое число bNewLine DB 13, 10, '0' ;Переменная для перехода на новую строчку в файле oclock db '0$' ;Объявляем переменные для вывода hours db ' з*б®ў $' minutes db ' ¬Ё*гв $' seconds db ' ᥪг*¤ $' year db ' Ј®¤ $' mounth db ' ¬Ґбпж $' chislo db ' зЁб«® $' datta db '‘ҐЈ®¤*п: $' time db '‚६п: $' perehod db 13, 10, '$' Stolbec db 1 ;номер строки Stroca db 1 ;номер столбца string1 db 6 dup (?),'$' ;буфер для хранения ASC2 .Code Start: Mov AX, @Data Mov DS, AX ;Инициализация сегмента данных Mov AX, 3h Int 10h ;Очистка экрана Mov AH, 2Ch ;Получение времени Int 21h mov ah,09h mov dx,offset time int 21h CMP CH, 0 JE Usl Xor EAX, EAX ;Вывод часов Mov AL, CH Call Num_Out JMP EndUsl Usl: Mov AH,09h Mov DX,offset oclock Int 21h EndUsl: mov ah,09h mov dx,offset hours int 21h Mov AH, 2Ch ;Получение времени Int 21h Xor EAX, EAX ;Вывод минут Mov AL, CL Call Num_Out mov ah,09h mov dx,offset minutes int 21h Xor EAX, EAX ;Вывод секунд Mov AL, DL Call Num_Out mov ah,09h mov dx,offset seconds int 21h mov ah,09h ;Переход на следующую строку mov dx,offset perehod int 21h mov ah,09h mov dx,offset datta int 21h ;Чтение системной даты MOV AH, 2AH ;Функция чтения даты. INT 21H ;CX -год, DH - месяц, DL-день mov ax, cx ;сохраним месяц и день в AX push dx ;сохраним в стеке месяц и день call DEC_ASC2 ;переведем год в ASC2 Mov AH, 2Ah ;Получение даты Int 21h Xor EAX, EAX ;Вывод числа Mov AL, DL Call Num_Out mov ah,09h mov dx,offset chislo int 21h Mov AH, 2Ah ;Получение даты Int 21h Xor EAX, EAX ;Вывод месяца Mov AL, DH Call Num_Out mov ah,09h mov dx,offset mounth int 21h ;Выведем год на экран mov Stolbec, 26 mov Stroca,1 call Superkursor LEA DX, string1 ;в DX - адрес строки MOV AH, 09H ;Прерывание DOS INT 21H ;для вывода на экран mov ah,09h mov dx,offset year int 21h Mov AH, 10h Int 16h ;Ожидание нажатия любой клавиши Mov AH, 4Ch Int 21h ;Выход в DOS ;Процедуры Num_Out Proc Near ;Процедура вывода данных на экран ;Uses EAX, EBX, ECX, EDX Xor DI, DI ;В DI будет длина выводимого числа Mov ECX, 10 ;Задаем делитель Push EAX ;Вычисляем длину выводимого числа Next_Length: Xor EDX, EDX Div ECX Inc DI Cmp EAX, 0 JNZ Next_Length Pop EAX ;Вычислили длину (В DI) Mov SI, wNumOff Add SI, DI Inc SI Next_Num: Xor EDX, EDX Div ECX Add DL, '0' Mov Byte PTR [SI], DL Dec SI Cmp EAX, 0 JNZ Next_Num Inc SI Mov AH, 40h Mov BX, 1 Mov CX, DI Mov DX, SI Int 21h ;Записали число на экран Ret Num_Out EndP ;Конец процедуры ;Процедура позиционирования курсора Superkursor proc MOV AH,2 MOV BH,0 MOV DH,Stroca mov DL,Stolbec INT 10H ret Superkursor endp ;Процедура преобразования кода в ASC2 ;Берет значение из регистра AX переводит в ASC2 и помещает в буфер string1 DEC_ASC2 proc xor dx,dx mov SI,0 mov bx, 10 xor cx, cx WS_calc_loop: xor dx, dx div bx or dx, '0' push dx inc cx test ax,ax jnz WS_calc_loop WS_form_loop: pop ax mov string1[si],al inc si loop WS_form_loop inc si mov string1[si],'$' ret DEC_ASC2 endp End Start ;Конец программы
Решение задачи: «Вывод системной даты, времени и даты ближайшего воскресенья»
textual
Листинг программы
.Model Small .486p .Stack 100h .Data wNumOff DW 10 Dup(0) ;Смещение строки, где будет содержаться печатаемое число bNewLine DB 13, 10, '0' ;Переменная для перехода на новую строчку в файле oclock db '0$' ;Объявляем переменные для вывода hours db ' hours $' minutes db ' minutes $' seconds db ' seconds $' year db ' year $' mounth db ' month $' chislo db ' date $' datta db 'Today: $' time db 'Time: $' perehod db 13, 10, '$' Stolbec db 1 ;номер строки Stroca db 1 ;номер столбца string1 db 6 dup (?),'$' ;буфер для хранения ASC2 .Code Start: Mov AX, @Data Mov DS, AX ;Инициализация сегмента данных Mov AX, 3h Int 10h ;Очистка экрана Mov AH, 2Ch ;Получение времени Int 21h mov ah,09h mov dx,offset time int 21h CMP CH, 0 JE Usl Xor EAX, EAX ;Вывод часов Mov AL, CH Call Num_Out JMP EndUsl Usl: Mov AH,09h Mov DX, offset oclock Int 21h EndUsl: mov ah,09h mov dx, offset hours int 21h Mov AH, 2Ch ;Получение времени Int 21h Xor EAX, EAX ;Вывод минут Mov AL, CL Call Num_Out mov ah,09h mov dx, offset minutes int 21h Xor EAX, EAX ;Вывод секунд Mov AL, DL Call Num_Out mov ah,09h mov dx, offset seconds int 21h mov ah,09h ;Переход на следующую строку mov dx, offset perehod int 21h mov ah,09h mov dx, offset datta int 21h ;Чтение системной даты MOV AH, 2AH ;Функция чтения даты. INT 21H ;CX -год, DH - месяц, DL-день mov ax,cx ;сохраним месяц и день в AX push dx ;сохраним в стеке месяц и день call DEC_ASC2 ;переведем год в ASC2   Mov AH, 2Ah ;Получение даты Int 21h Xor EAX, EAX ;Вывод числа Mov AL, DL Call Num_Out mov ah,09h mov dx, offset chislo int 21h Mov AH, 2Ah ;Получение даты Int 21h Xor EAX, EAX ;Вывод месяца Mov AL, DH Call Num_Out mov ah,09h mov dx, offset mounth int 21h ;Выведем год на экран mov Stolbec,24 mov Stroca,1 call Superkursor LEA DX, string1 ;в DX - адрес строки MOV AH, 09H ;Прерывание DOS INT 21H ;для вывода на экран mov ah,09h mov dx, offset year int 21h Mov AH, 10h Int 16h ;Ожидание нажатия любой клавиши Mov AH, 4Ch Int 21h ;Выход в DOS ;Процедуры Num_Out Proc Near ;Процедура вывода данных на экран ;Uses EAX, EBX, ECX, EDX Xor DI, DI ;В DI будет длина выводимого числа Mov ECX, 10 ;Задаем делитель  Push EAX ;Вычисляем длину выводимого числа Next_Length: Xor EDX, EDX Div ECX Inc DI Cmp EAX, 0 JNZ Next_Length Pop EAX ;Вычислили длину (В DI) Mov SI, wNumOff Add SI, DI Inc SI Next_Num: Xor EDX, EDX Div ECX Add DL, '0' Mov Byte PTR [SI], DL Dec SI Cmp EAX, 0 JNZ Next_Num Inc SI Mov AH, 40h Mov BX, 1 Mov CX, DI Mov DX, SI Int 21h ;Записали число на экран Ret Num_Out EndP ;Конец процедуры ;Процедура позиционирования курсора Superkursor proc MOV AH,2 MOV BH,0 MOV DH, Stroca mov DL, Stolbec INT 10H ret Superkursor endp  ;Процедура преобразования кода в ASCII ;Берет значение из регистра AX, переводит в ASCII и помещает в буфер string1 DEC_ASC2 proc xor dx,dx mov SI,0 mov bx, 10 xor cx, cx WS_calc_loop: xor dx, dx div bx or dx, '0' push dx inc cx test ax,ax jnz WS_calc_loop WS_form_loop: pop ax mov string1[si],al inc si loop WS_form_loop inc si mov string1[si],'$' ret DEC_ASC2 endp End Start ;Конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д