Debugging 汇编程序x86 16位-masm窗口:通过调试器(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

作为一名学生,我有一个项目要做,我正要完成他,这时我发生了一件奇怪的事情——当我通过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命令行

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可以使用什么“安全”中断来测试他的代码呢?