Ассемблер x86 16bit - masm windows: запуск моей программы через отладчик (cv) дает другой результат, что без отладки
У меня есть проект для студента, и я собирался закончить его, когда у меня произошла странная вещь - когда я запускаю свою программу через отладчик 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
Задание:
Напишите программу "DO_ALL", которая принимает один параметр из командной строки MS-DOS.
т.е. введите в Dosbox:
C:> DO_ALL DATE
или же
C:> DO_ALL TIME
запустить вашу программу с помощью команды "ДАТА" или "ВРЕМЯ" соответственно.
Программа DO_ALL должна определить соответствующую команду и выполнить
следующим образом:
ДАТА - представить дату (используйте int21/2A) - представить только день
ВРЕМЯ - представляет время (используйте int21/2C) - представляет только час
INTx (здесь x - 1 цифра, например, INT4 или INT0) - вывести CS:IP-адрес ISR
номера прерывания х.
Подсказка: используйте информацию в PSP, чтобы выяснить команду (последние 2
поля)
К сожалению, как я уже сказал, когда я запускаю его так - cv DO_ALL INT4 я получаю этот результат - 043F:038E (после запуска программы в отладчике) .
И когда я запускаю это так - DO_ALL INT4 я получаю этот результат - 0070:0008
Кто-то знает что делать ((