Assembly 如何通过汇编语言交互获得时间
我写了一个代码来通过cmd中的汇编打印窗口时钟,但它给了我一个除法溢出错误。我需要一个帮助来发现我的代码中的错误,并需要正确的代码来打印cmd中的窗口时钟Assembly 如何通过汇编语言交互获得时间,assembly,Assembly,我写了一个代码来通过cmd中的汇编打印窗口时钟,但它给了我一个除法溢出错误。我需要一个帮助来发现我的代码中的错误,并需要正确的代码来打印cmd中的窗口时钟 [org 0x0100] jmp start HR DB 0 MIN DB 0 SEC
[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数字
对每行代码执行类似操作;告诉读者你做这件事的目的和原因。