如何通过汇编语言中断获得时间

时间:2014-07-20 15:11:33

标签: assembly

我编写了一个代码来通过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.....

2 个答案:

答案 0 :(得分:0)

可悲的是,你的程序不仅仅是一个错误! 这是一些问题:

子程序PRINTNUM和CLRSCR开始发布但是它们不会继续!他们甚至陷入了彼此!

在DISPLAY子程序的第五行,您需要mov dl,bl

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

用DOS函数2Ch检索系统时间后,DOS函数09h无法显示。 DX有二进制信息而不是地址!

为什么你连续2个DOS中断调用结束?

我认为您需要mov al,[MIN]mov al,[SEC]而不是mov al,MINmov al,SEC

答案 1 :(得分:0)

注意:对于“MASM”,它只是“mov al,MIN”和&amp ;;之间的化妆风格。 “mov al,[MIN]”,但在括号内更快地清楚“MIN”不是用作立即值的常量,而是一个内存位置,而不需要查看常量和数据声明。所以是的,建议使用方括号[]来显示差异。并且对于使用NASM,括号是用于存储器访问的importend。