2016-11-13 5 views
-4

Этот код должен отображать дату в виде года: месяц: день, но год показывает, как 20f4 и день показывает как 58, и я не могу понять, почему.неправильный вывод программы сборки

; return: CX = year (1980-2099). DH = month. DL = day. AL = day of week (00h=Sunday) 
displaydate: 
mov ah,2Ah 
int 21h ; get date 

mov dl,' ' 
mov ah,02h 
int 21h 
mov dl,' ' 
mov ah,02h 
int 21h 
mov dl,'2' 
mov ah,02h 
int 21h 
mov dl,'0' 
mov ah,02h 
int 21h 


mov al,cl ; year 
mov ah,0 
mov bl,10 
div bl 

mov years1,al ; number 
mov years2,ah ;remainder 
add years1,30h 
add years2,30h;asci code 

mov dl,years1 
mov ah,02h 
int 21h 
mov dl,years2 
mov ah,02h 
int 21h 
mov dl,':' 
mov ah,02h 
int 21h 
;--------------------------------------------- 

mov al,dh ;months 
mov ah,0 
mov bl,10 
div bl 

mov month1,al ; number 
mov month2,ah ;remainder 
add month1,30h 
add month2,30h;asci code 

mov dl,month1 
mov ah,02h 
int 21h 
mov dl,month2 
mov ah,02h 
int 21h 
mov dl,':' 

mov ah,02h 
int 21h 
;------------------------------------------------- 
mov al,DL ;days 
mov ah,0 
mov bl,10 
div bl 

mov days1,al ; number 
mov days2,ah ;remainder 
add days1,30h 
add days2,30h;asci code 

mov dl,days1 
mov ah,02h 
int 21h 
mov dl,days2 
mov ah,02h 
int 21h 
+1

Вы не указали никаких устранения неполадок или отладки шагов, которые вы уже следовали. Самый первый должен быть: «Пройдите через него с помощью отладчика и посмотрите, в какой момент вы начинаете поведение, которое вы не понимаете». Чаще всего это позволит * * решить проблему. –

ответ

2
mov al,cl ; year 
mov ah,0 
mov bl,10 
div bl 

Почему вы используете только CL регистр здесь?
Если вы получили дату от DOS через функцию 2Ah, то вы получили номер за год во всем регистре CX. Это будет в диапазоне 1980-2099 гг. Ваша программа должна вычесть 2000 из этого значения до обработки лет в веках (0-99):

mov ax, cx ;Year 
sub ax, 2000 
mov bl, 10 
div bl 

день показывает, как 58 и я не могу fiure почему

Номер для дня хранится в регистре DL, но время, когда ваша программа готова к его обработке, номер в DL был изменен на весь промежуточный код для отображения символа с помощью DOS! Значение вы вносите в него много других ценностей. Используйте push/pop не потерять значение дня:

mov ah,2Ah 
int 21h ; get date 
PUSH DX <<< This preserves the day value in DL 

;do all the other stuff 

POP DX <<< This restores the day value in DL 
;------------------------------------------------- 
mov al,DL ;days 
mov ah,0 
mov bl,10 
div bl 
mov days1,al ; number 
mov days2,ah ;remainder 
add days1,30h 
add days2,30h;asci code 
Смежные вопросы