我的代码在这里:
org 100h
mov ah, 2ch
int 21h
mov ah, 2
mov dl, ch
int 21h
mov ah, 2
mov dl, cl
int 21h
ret
我想要的是显示系统时间。 但它会显示其他字符。我该如何解决这个问题?
编辑: 我怎么能在这里添加一个除法运算?我想我想要的是将ch和cl除以10并单独打印
感谢答案
答案 0 :(得分:4)
小时范围从0到23.
分钟从0到59。
它们是两位数字,因此必须处理。
没有打印数字的内置服务,Int 21/AH=02h
打印字符,您需要将两位数字(8位数量)转换为{{3} (两个8位数量) 1 。
这个网站有很多例子,这里只使用简单的说明。
ORG 100h
mov ah, 2ch ;Get time
int 21h
mov dl, ch ;Show hours
call itoa99
mov ah, 02h ;Show separator
mov dl, ':'
int 21h
mov dl, cl ;Show minutes
call itoa99
mov ax, 4c00h ;Exit
int 21h
;dl = number to display (0..99)
itoa99:
push bx
push ax ;Save registers used
xor ax, ax ;AX = 0
mov al, dl ;AX = DL
mov bl, 10d
div bl ;AL = AX/10, AH = AX mod 10
;AX contains the digits
add ax, 3030h ;Transform digit to digitals
;ASCII digits starts at 30h, digit X is the char 30h+X
;ASCII value: 30h 31h 32h 33h ... 39h
;Character: 0 1 2 3 ... 9
mov bx, ax ;Save for later
;Show the digits
mov dl, bl
mov ah, 02h
int 21h
mov dl, bh
int 21h
pop ax
pop bx
ret
1 两位数字有......两位数
基数10是位置系统,它意味着数字表示由称为数字的加权数量组成
每个数字本身就是一个数字,但很简单,有一个独特的符号关联,数字
例如,数字4用各种符号表示,取决于文化:'4','ד','四','IV','4',......
<子>
要在基数10中显示数字,我们首先需要提取数字,然后将数字转换为数字。最终结果是数字
要提取0-59范围编号的两个基数10位,我们只需使用:d0 = n mod 10, d1 = n / 10
说服你自己这确实给出了正确的结果,并且每个di
都在0到9之间。
答案 1 :(得分:0)
此代码可能对您有所帮助。您可以在此处找到并下载:Timer Tick Example of Assembly Language
[org 0x0100]
jmp start
incTime: dw 0
hrs: dw 0
min: dw 0
sec: dw 0
clearScreen:
push ax
push di
push es
mov ax , 0xB800
mov es , ax
mov di , 0
nextCls:
mov word [es:di] , 0x0720
add di , 2
cmp di , 4000
jne nextCls
pop es
pop di
pop ax
ret
printTime:
push bp
mov bp , sp
push ax
push bx
push cx
push dx
push si
push di
push es
call clearScreen
mov si , 0 ;counter to use 3 prints i.e. Hrs, Min, Sec
mov ax , 0xB800
mov es , ax
mov di , 142
nextState:
mov bx , bp
sub bx , si
add bx , 8
mov ax , [bx] ;BX=BP-SI+8
mov bx , 10
mov cx , 0
nextDigit:
mov dx , 0
div bx
add dl , 0x30
push dx
inc cx
cmp ax , 0
jnz nextDigit
nextPos:
pop dx
mov dh , 0x07
mov [es:di] , dx
add di , 2
loop nextPos
add si , 2
cmp si , 6
jz return
mov dl , ':'
mov [es:di] , dx
add di , 2
jmp nextState
return:
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop bp
ret 6
Clock:
push ax
inc word [cs:incTime]
cmp word [cs:incTime] , 18
jz Reset
proceedToCall:
push word [cs:hrs]
push word [cs:min]
push word [cs:sec]
call printTime
mov al , 0x20
out 0x20 , al
pop ax
iret
Reset:
mov word [cs:incTime] , 0
inc word [cs:sec]
cmp word [cs:sec] , 60
jnz proceedToCall
mov word [cs:sec] , 0
inc word [cs:min]
cmp word [cs:min] , 60
jnz proceedToCall
mov word [cs:min] , 0
inc word [cs:hrs]
cmp word [cs:hrs] , 24
jnz proceedToCall
mov word [cs:hrs] , 0
jmp proceedToCall
start:
xor ax , ax
mov es , ax
cli
mov word [es:8*4] , Clock
mov word [es:8*4+2] , cs
sti
mov dx , start
add dx , 15
mov cl , 4
shr dx , cl
mov ax , 0x3100
int 0x21
答案 2 :(得分:0)
我明白了!
org 100h
mov ah, 2ch ;get time
int 21h ;
mov hour, ch
mov mins, cl
mov ah, 0 ;
mov al, hour ;divide by 10
mov bl, 10 ;
div bl ;
mov hour1, al
mov hour2, ah
mov ah, 2 ;
mov dl, hour1 ;
add dl, 30h ;
int 21h ;
;print hour
mov ah, 2 ;
mov dl, hour2 ;
add dl, 30h ;
int 21h ;
mov ah, 2
mov dl, ':'
int 21h
mov ah, 0 ;
mov al, mins ;divide by 10
mov bl, 10 ;
div bl ;
mov min1, al
mov min2, ah
mov ah, 2 ;
mov dl, min1 ;
add dl, 30h ;
int 21h ;
;print minuntes
mov ah, 2 ;
mov dl, min2 ;
add dl, 30h ;
int 21h ;
ret
hour db ? ;
mins db ? ;
hour1 db ? ;
hour2 db ? ;initialize variables
min1 db ? ;
min2 db ? ;