题目:以"年/月/日 时:分:秒"的格式,显示当前的日期,时间
提示:在此代码的基础上加以改造
assume cs:code
code segment
start:mov al,9 ;年out 70h,al ;传入9号单元的地址in al,71h ;取9号单元的内容,高4位为十位、低4位为各位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30hadd al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2],ah mov byte ptr es:[160*12+40*2+1],2hmov es:[160*12+40*2+2],almov byte ptr es:[160*12+40*2+3],2hmov ax,4c00hint 21h
code ends
end start
方案1
assume cs:code
code segment
start:s: mov al,9 ;年out 70h,al ;传入9号单元的地址in al,71h ;取9号单元的内容,高4位为十位、低4位为各位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30hadd al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2],ah mov byte ptr es:[160*12+40*2+1],7h ;为黑底白字mov es:[160*12+40*2+2],almov byte ptr es:[160*12+40*2+3],7h ;为黑底白字mov byte ptr es:[160*12+40*2+4],2fh ;ASCII码对应/mov byte ptr es:[160*12+40*2+5],7h ;为黑底白字;这行不需要写xor ax,ax,原因是下方指令执行时会覆盖掉旧值mov al,8 ;月out 70h,al ;传入8号单元的地址in al,71h ;取8号单元的内容,高4位为十位、低4位为各位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30hadd al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2+6],ah mov byte ptr es:[160*12+40*2+7],7h ;为黑底白字mov es:[160*12+40*2+8],almov byte ptr es:[160*12+40*2+9],7h ;为黑底白字mov byte ptr es:[160*12+40*2+10],2fh ;ASCII码对应/mov byte ptr es:[160*12+40*2+11],7h ;为黑底白字mov al,7 ;日out 70h,al ;传入7号单元的地址in al,71h ;取7号单元的内容,高4位为十位、低4位为各位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30hadd al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2+12],ah mov byte ptr es:[160*12+40*2+13],7h ;为黑底白字mov es:[160*12+40*2+14],almov byte ptr es:[160*12+40*2+15],7h ;为黑底白字mov byte ptr es:[160*12+40*2+16],20h ;ASCII码对应空格mov byte ptr es:[160*12+40*2+17],7h ;为黑底白字mov al,4 ;时out 70h,al ;传入4号单元的地址in al,71h ;取4号单元的内容,高4位为十位、低4位为各位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30hadd al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2+18],ah mov byte ptr es:[160*12+40*2+19],7h ;为黑底白字mov es:[160*12+40*2+20],almov byte ptr es:[160*12+40*2+21],7h ;为黑底白字mov byte ptr es:[160*12+40*2+22],3Ah ;ASCII码对应:mov byte ptr es:[160*12+40*2+23],7h ;为黑底白字mov al,2 ;分out 70h,al ;传入2号单元的地址in al,71h ;取2号单元的内容,高4位为十位、低4位为各位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30hadd al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2+24],ah mov byte ptr es:[160*12+40*2+25],7h ;为黑底白字mov es:[160*12+40*2+26],almov byte ptr es:[160*12+40*2+27],7h ;为黑底白字mov byte ptr es:[160*12+40*2+28],3Ah ;ASCII码对应:mov byte ptr es:[160*12+40*2+29],7h ;为黑底白字mov al,0 ;秒out 70h,al ;传入0号单元的地址in al,71h ;取0号单元的内容,高4位为十位、低4位为各位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30hadd al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2+30],ah mov byte ptr es:[160*12+40*2+31],7h ;为黑底白字mov es:[160*12+40*2+32],almov byte ptr es:[160*12+40*2+33],7h ;为黑底白字jmp s ;无限条件1循环,一直刷新时间mov ax,4c00hint 21h
code ends
end start
最容易想到,虽然能成功显示,但是不够简洁,执行效率较低
方案2
可以在方案1的基础上内嵌两个循环
CMOS RAM的存放单元为:
秒:0 分:2 时:4 日:7 月:8 年:9
0,2,4单元间隔2 7,8,9单元是连续的
注意:调用loop循环时必定会用到cx,但是在显示时间时用到了cx(mov cl,4),因此要入栈保存
assume cs:code
code segment
start:
s:xor si,simov dl,9 ;从9号单元开始mov cx,3 ;循环3次 s1: push cx ;保存cx的值mov al,dl ;年out 70h,al ;传入al号单元的地址in al,71h ;取9号单元的内容,高4位为十位、低4位为个位mov ah,almov cl,4 shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30h ;转换为十进制的ASCII码值add al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2+0+si],ah mov byte ptr es:[160*12+40*2+1+si],7h ;为黑底白字mov es:[160*12+40*2+2+si],almov byte ptr es:[160*12+40*2+3+si],7h ;为黑底白字mov byte ptr es:[160*12+40*2+4+si],2fh ;ASCII码对应/mov byte ptr es:[160*12+40*2+5+si],7h ;为黑底白字dec dladd si,6pop cx ;恢复cx的值loop s1 ;年/月/日/打印的循环sub si,2;把日后面的/改成空格mov byte ptr es:[160*12+40*2+si],20h ;ASCII码对应空格add si,2 ;恢复si的值mov dl,4 ;从4号单元开始mov cx,3s2:push cxmov al,dl out 70h,al ;传入al号单元的地址in al,71h ;取al号单元的内容,高4位为十位、低4位为个位mov ah,almov cl,4shr ah,cl ;高4位 and al,00001111b ;低4位add ah,30h ;转换为十进制的ASCII码值add al,30h ;转换为十进制的ASCII码值mov bx,0b800hmov es,bx mov es:[160*12+40*2+18+0+si],ah mov byte ptr es:[160*12+40*2+1+si],7h ;为黑底白字mov es:[160*12+40*2+2+si],almov byte ptr es:[160*12+40*2+3+si],7h ;为黑底白字mov byte ptr es:[160*12+40*2+4+si],3Ah ;ASCII码对应:mov byte ptr es:[160*12+40*2+5+si],7h ;为黑底白字sub dl,2add si,6pop cxloop s2jmp s ;一直刷新时间mov ax,4c00hint 21h
code ends
end start