Вывод системной даты, времени и даты ближайшего воскресенья - 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  ;Конец программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы