Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 基本汇编语言Get&;显示系统时间_Assembly_X86_Dos - Fatal编程技术网

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的替代品。尽管此代码可能有助于解决问题,提供关于为什么和/或如何回答问题的额外背景,将显著提高其长期价值。请在您的答案中添加一些解释。尽管此代码可能有助于解决问题,但提供有关其回答问题的原因和/或方式的附加上下文将显著提高其长期价值。请在您的回答中添加一些解释。