私は学生として行うプロジェクトを持っていて、奇妙なことが起こったときに彼を終わらせようとしていました.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
誰かが何をすべきか知っています:((