我编写了一个代码来通过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.....
答案 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,MIN
和mov al,SEC
。
答案 1 :(得分:0)
注意:对于“MASM”,它只是“mov al,MIN”和&amp ;;之间的化妆风格。 “mov al,[MIN]”,但在括号内更快地清楚“MIN”不是用作立即值的常量,而是一个内存位置,而不需要查看常量和数据声明。所以是的,建议使用方括号[]来显示差异。并且对于使用NASM,括号是用于存储器访问的importend。