Assembly 基本汇编语言Get&;显示系统时间
我这里有一个代码:Assembly 基本汇编语言Get&;显示系统时间,assembly,x86,dos,Assembly,X86,Dos,我这里有一个代码: 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到23。 从0到59分钟 它们是两位数,因此必须进行处理 没有打印数字的内置服务,Int 21/AH
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到23。
从0到59分钟 它们是两位数,因此必须进行处理 没有打印数字的内置服务,
Int 21/AH=02h
打印字符,您需要将一个两位数字(一个8位数字)转换为一个(两个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
一个两位数的数字已经。。。两位数。
基数10是一个位置系统,它意味着数字表示由称为数字的加权量组成。
每个数字本身就是一个数字,但足够简单,可以有一个唯一的相关符号,一个数字。
例如,数字4根据区域性使用不同的符号表示:“4”、“ד”和“4”四', '四、‘٤’、。。。 要以10为基数显示数字,我们首先需要提取数字,然后将数字转换为数字。最终结果是一个数字。
要提取0-59范围数字的两个以10为基数的数字,我们只需使用:
d0=n mod 10,d1=n/10
让自己相信这确实给出了正确的结果,并且每个
di
都在0到9之间 小时数范围从0到23。从0到59分钟 它们是两位数,因此必须进行处理 没有打印数字的内置服务,
Int 21/AH=02h
打印字符,您需要将一个两位数字(一个8位数字)转换为一个(两个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
一个两位数的数字已经。。。两位数。
基数10是一个位置系统,它意味着数字表示由称为数字的加权量组成。
每个数字本身就是一个数字,但足够简单,可以有一个唯一的相关符号,一个数字。
例如,数字4根据区域性使用不同的符号表示:“4”、“ד”和“4”四', '四、‘٤’、。。。 要以10为基数显示数字,我们首先需要提取数字,然后将数字转换为数字。最终结果是一个数字。
要提取0-59范围数字的两个以10为基数的数字,我们只需使用:
d0=n mod 10,d1=n/10
让自己相信这确实给出了正确的结果,并且每个
di
都在0到9之间 此代码可能对您有所帮助。您可以在此处找到,也可以下载:
此代码可能对您有所帮助。您可以在此处找到,也可以下载: 我明白了
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 ? ;
我明白了
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 ? ;
两个小评论:(a)小时数从0到23;(b)如果你在
Int 21/AH=02
@Fifoernik中没有正确的前缀/后缀,没有经验的用户可能不会立即意识到他们需要使用十六进制,谢谢,多愚蠢的错误啊!:)Int 21/AH=02
应为Int 21/AH=02h
。这是命名法,所以我不会在21后面加一个h。。。我复制并粘贴了程序。但我还是不明白。对不起,我是个笨蛋。我们的指导老师只教了我们上面使用的代码,我们没有使用push、xor和许多类似的东西。谢谢你的回答,我很感激。好的,谢谢你的回答。我想我想要的是将ch和cl除以10,然后分别打印字符。我试过这个,它说的是16位8位操作数。我的一个batchmate已经做了这件事,而且很有效,他只使用了mov
代码和div
代码,我不想复制他的工作,我只想举一个简单程序的例子,其中包括div
代码感谢两个小备注:(a)小时范围从0到23;(b)如果您在Int 21/AH=02
@Fifoernik谢谢,多愚蠢的错误!:)中没有写正确的前缀/后缀,没有经验的用户可能不会立即意识到他们需要使用十六进制Int 21/AH=02
应为Int 21/AH=02h
。这是命名法,所以我不会在21后面加一个h。。。我复制并粘贴了程序。但我还是不明白。对不起,我是个笨蛋。我们的指导老师只教了我们上面使用的代码,我们没有使用push、xor和许多类似的东西。谢谢你的回答,我很感激。好的,谢谢你的回答。我想我想要的是将ch和cl除以10,然后分别打印字符。我试过这个,它说的是16位8位操作数。我的一个同事做了这件事,他只使用了mov
代码和div
代码,我不想复制他的作品,我只想要一个简单程序的例子,其中包括div
代码,谢谢。在这种情况下,该指令将是div的替代品。在这种情况下,该指令将是div的替代品。尽管此代码可能有助于解决问题,提供关于为什么和/或如何回答问题的额外背景,将显著提高其长期价值。请在您的答案中添加一些解释。尽管此代码可能有助于解决问题,但提供有关其回答问题的原因和/或方式的附加上下文将显著提高其长期价值。请在您的回答中添加一些解释。