2016-11-13 8 views
-4

このコードは、年:月:日の形式で日付を表示する必要がありますが、年は20f4、日は58と表示され、理由を特定できません。あなたはここでしかCLレジスタを使用しないのはなぜアセンブリプログラムの出力が正しくありません

; 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

:日の値を失うしないようにpush/pop使用してください。非常に最初のものは、「デバッガを使ってステップを進め、あなたが理解していない振る舞いをいつ始めるかを確認してください」。多くの場合、これは* you *が問題を解決することを可能にします。 –

答えて

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


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経由で!意味他にも多くの値を入れます。あなたはすでに続いている任意のトラブルシューティングやデバッグの手順を列挙されていない

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 
関連する問題