Assembly 如何通过汇编语言交互获得时间

Assembly 如何通过汇编语言交互获得时间,assembly,Assembly,我写了一个代码来通过cmd中的汇编打印窗口时钟,但它给了我一个除法溢出错误。我需要一个帮助来发现我的代码中的错误,并需要正确的代码来打印cmd中的窗口时钟 [org 0x0100] jmp start HR DB 0 MIN DB 0 SEC

我写了一个代码来通过cmd中的汇编打印窗口时钟,但它给了我一个除法溢出错误。我需要一个帮助来发现我的代码中的错误,并需要正确的代码来打印cmd中的窗口时钟

             [org 0x0100]
                            jmp start
                             HR DB 0
                             MIN DB 0
                             SEC DB 0
                  printnum:  push bp
                             mov bp, sp
                             push es
                             push ax
                             push bx
                             push cx
                             push dx
                             push di
                             mov ax, 0xb800
                             mov es, ax 
                             mov ax, [bp+4] 
                             mov bx, 10 
                             mov cx, 0
               clrscr: 
                             push es
                             push ax
                             push di
                             mov ax, 0xb800
                             mov es, ax 
                             mov di, 0
              nextdigit:   
                             mov dx, 0 
                             div bx 
                             add dl, 0x30 
                             push dx 
                             inc cx 
                             cmp ax, 0 
                             jnz nextdigit 
                             mov di, 0 
                 nextpos:    pop dx 
                             mov dh, 0x07 
                             mov [es:di], dx 
                             add di, 2 
                             loop nextpos 
                             pop di
                             pop dx
                             pop cx
                             pop bx
                             pop ax
                             pop es
                             pop bp
                             ret 2

                 DISPLAY:

                             MOV DL, BH
                             ADD DL, 30H            
                             MOV AH, 02H
                             INT 21H
                             ADD DL, 30H    
                             MOV AH, 02H
                             INT 21H
                             RET
                    start: 
                             call clrscr 
                             call printnum

                             MOV DS, AX
                             MOV AH,2CH         
                             INT 21H
                             MOV AH, 09H
                             INT 21H
                             MOV DL, ':'            
                             MOV AH, 02H
                             INT 21H
                             MOV AL, MIN      
                             AAM     
                             MOV BX, AX
                             CALL DISPLAY           
                             MOV DL, ':'            
                             MOV AH, 02H
                             INT 21H
                             MOV AL, SEC    
                             AAM                   
                             MOV BX, AX
                             CALL DISPLAY           
                             MOV AH, 4CH
                             INT 21H
                             int 0x21
        This is the code when is use in nasm i give me error divide over please solve my problem.....

遗憾的是,你的程序不仅仅是一个错误! 以下是一些问题:

子例程PRINTNUM和CLRSCR开始发出提示,但随后它们就不再继续了!他们甚至会互相撞到一起

在显示子例程的第五行,您需要
mov dl,bl

调用PRINTNUM时,堆栈上至少需要一些16位的值

使用DOS功能2Ch检索系统时间后,DOS功能09h没有显示任何内容。DX有二进制信息而不是地址

为什么一行有两个DOS中断调用


我想你需要的是
mov-al,[MIN]
mov-al,[SEC]
而不是
mov-al,MIN
mov-al,SEC

注意:对于“MASM”,它只是介于“mov-al,MIN”和“mov-al,[MIN]”之间的一种修饰样式,但在括号内,更清楚的是,“MIN”不是用作立即值的常量,而是一个内存位置,无需查看常量和数据声明。因此,建议使用括号[]来表示差异。对于使用NASM,括号对于内存访问非常重要。

我看到的第一件事是84行代码,没有一条注释。你把他们排除在外是在自杀。如果您在每行代码中添加一条简短的、描述性的、有帮助的注释,您将实现一个主要优势。示例:注释行
adddl,30H
将大大提高调试效率。像这样写评论:
;这是为了让DL现在保存一个Ascii数字
对每行代码执行类似操作;告诉读者你做这件事的目的和原因。