Debugging 汇编程序x86 16位-masm窗口:通过调试器(cv)运行我的程序会带来不同的结果,而不需要调试
作为一名学生,我有一个项目要做,我正要完成他,这时我发生了一件奇怪的事情——当我通过cv调试器运行我的程序时,我得到的结果与简单地运行它不同 这是我的密码,他想做这件事:Debugging 汇编程序x86 16位-masm窗口:通过调试器(cv)运行我的程序会带来不同的结果,而不需要调试,debugging,assembly,x86,interrupt,code-view,Debugging,Assembly,X86,Interrupt,Code View,作为一名学生,我有一个项目要做,我正要完成他,这时我发生了一件奇怪的事情——当我通过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, b
.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命令行
i、 e.在dosbox中键入:
C:>你们都有日期吗
或
C:>一直都是这样
分别使用“日期”或“时间”命令运行程序
DO_ALL程序应找出适当的命令和
扮演
如下:
日期–显示日期(使用int21/2A)-仅显示日期
时间–显示时间(使用int21/2C)-仅显示小时
INTx(此处x为1位数字,例如INT4或INT0)–打印CS:IP
情报、监视和侦察
中断数x的数目
提示:使用PSP中的信息了解命令(
最后2
字段)
不幸的是,正如我所说,当我像那样运行-cv DO_ALL INT4时,我得到了这个结果-043F:038E(在调试器中运行程序之后)
当我像那样运行它时-dou_ALL INT4我得到这个结果-0070:0008
有人知道该怎么做
调试器通常需要做一些奇怪的事情(例如捕捉“算术溢出”,这就是它的用途)。因此,cv可能会重新映射某些中断,作为其在DOS下工作的一部分?不要将文本输出作为图像发布。这很可能是正常行为,调试器也是DOS程序,它接下来执行您的exe,因此环境已经被调试器修改,就像您的代码可用内存大大减少,加载到up中的内存大大增加一样每个内存区域,调试器都可以安装自己的ISR…调试代码以确保正确打印ISR地址(例如,在其中放置假地址值以尝试不同的值并验证十六进制格式化程序),仅此而已。您甚至可以在代码开始时安装自己的INTx处理程序,以查看输出是否符合预期(作为测试)。我加载了codeview并可以确认一些(不是全部)调试程序重定向了中断的个数。当直接从0x0000:0x0000开始查看中断时,您的输出似乎是正确的。@MichaelPetch-那么,OP可以使用什么“安全”中断来测试他的代码呢?