2

私は学生として行うプロジェクトを持っていて、奇妙なことが起こったときに彼を終わらせようとしていました.cvデバッガーを介してプログラムを実行すると、単純に実行する場合とは異なる結果が得られます....

これが私のコードです、彼はこのことをすることを想定しています:

.model small
.stack 100h
.data 
.code
time proc
     mov ah, 02ch
     int 21h 
     mov bl, ch 
     call printit
     ret 
time endp
printit proc 
     mov  al, bl
     aam               ; divide by 10: quotient in ah, remainder in al (opposite of DIV)
     add  ax, "00"
     xchg al, ah
     mov  dx, ax
     mov  ah, 02h
     int  21h
     mov  dl, dh
     int  21h
     ret 
printit endp 
print4register proc 
     mov cx, 0 
LOOP1:
     inc cx 
     cmp cx, 5 
     jge ENDLOOP
     mov dx, 0 
     mov bx, 16
     div bx 
     cmp dx, 9 
     jg ABCDE
     add dl, '0' 
     push dx 
     jmp LOOP1
ABCDE:
     sub dl, 10 
     add dl, 'A'
     push dx 
     jmp LOOP1
ENDLOOP:     
     pop dx 
     mov ah, 02h 
     int 21h 
     pop dx 
     int 21h 
     pop dx 
     int 21h 
     pop dx 
     int 21h
     ret 
print4register endp 
date proc
     mov ah, 02ah
     int 21h 
     mov bl, dl 
     call printit
     ret 
date endp
start:   
     mov cl, byte ptr ds:[80h]    
     mov bx, 82h 
     mov ax, ds:[bx]
     cmp al, 'T'
     je TIMET 
     cmp al, 'D'
     je DATED
     cmp al, 'I'
     je INTI 
     jmp FINISH
TIMET:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'I'
     je TIMEI
     jmp FINISH
TIMEI:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'M'
     je TIMEM
     jmp FINISH
TIMEM:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'E'
     je TIMEE
     jmp FINISH
TIMEE:
     call time
DATED:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'A'
     je DATEA
     jmp FINISH
DATEA:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'T'
     je DATET
     jmp FINISH
DATET:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'E'
     je DATEE
     jmp FINISH
DATEE:
     call date
INTI:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'N'
     je INTN
     jmp FINISH
INTN:
     inc bx 
     mov ax, ds:[bx]
     cmp al, 'T'
     je INTT
     jmp FINISH
INTT:
     inc bx 
     mov ax, ds:[bx] 
     sub al, '0' 
     add al, al 
     add al, al ; mul al, 4  
     mov di, 0 
     mov ah, 0 
     add di, ax 
     mov ax, 0h 
     mov es, ax 
     mov ax, es 
     mov si, es:[di]
     mov di, es:[di + 2]
     mov ax, di 
     call print4register
     mov dl, ':'
     mov ah, 02h 
     int 21h 
     mov ax, si
     call print4register         

FINISH:
     mov ah, 4ch
     int 21h
end start             

タスク:

MS-DOS コマンド ラインから 1 つのパラメーターを受け取るプログラム "DO_ALL" を作成します。

つまり、dosbox に次のように入力します。

C:> DO_ALL DATE

また

C:> DO_ALL TIME

コマンド「DATE」または「TIME」をそれぞれ使用してプログラムを実行します。

DO_ALL プログラムは、適切なコマンドを見つけ出し、次のように実行する必要があります。

次のとおりです。

DATE – 日付を表示 (int21/2A を使用) – 日付のみを表示

TIME – 時刻を表示 (int21/2C を使用) – 時間のみを表示

INTx (ここで、x は INT4 または INT0 などの 1 桁です) – ISR の CS:IP を出力します。

割り込み番号 x の

ヒント: PSP の情報を使用して、コマンドを見つけます (最後の 2

田畑)

残念ながら、私が言ったように、そのように実行すると - cv DO_ALL INT4 私はこの結果を得る - 043F:038E (デバッガでプログラムを実行した後) .

そして、そのように実行すると - DO_ALL INT4 私はこの結果を得る - 0070:0008

誰かが何をすべきか知っています:((

私の dos 実行結果

4

0 に答える 0