下面的代码实现的功能是实时的显示时间,显示的效果就如同一个电子时钟,这个代码来自于“网易云课堂”讲汇编的一位老师(从0开始,讲的非常的好),这段代码老师写的太好了,贴在下面学习效仿一下:
assume cs:code, ds:data, ss:stackdata segmentdb 128 dup(0)
data endsstack segment stackdb 128 dup(0)
stack endscode segmentTIME_STYLE db 'YY/MM/DD HH:MM:SS', 0
TIME_CMOS db 9,8,7,4,2,0start:mov ax, stackmov ss, axmov sp, 128call init_regcall show_clockmov ax, 4c00hint 21h;----------------------------
show_clock:call show_time_style
showTime:mov si, OFFSET TIME_CMOSmov di, 160*10+30*2mov cx, 6showDate:mov al, ds:[si]out 70h, alin al, 71hmov ah, alshr ah, 1shr ah, 1shr ah, 1shr ah, 1and al, 00001111badd ah, 30hadd al, 30hmov es:[di], ahmov es:[di+2], alinc siadd di, 6loop showDatejmp showTimeret;----------------------------
init_reg:mov bx, 0b800hmov es, bxmov bx, csmov ds, bxret
;----------------------------
show_string:push dxpush dspush espush sipush dishowString:mov dl, ds:[si]cmp dl, 0je showStringRetmov es:[di], dladd di, 2inc sijmp showStringshowStringRet:pop dipop sipop espop dspop dxret;---------------------------
show_time_style:mov si, OFFSET TIME_STYLEmov di, 160*10+30*2call show_stringretcode ends
end start
体会:这段代码虽然初看起来有点绕,但是使用了模块化的思想,这里已经体现出大型程序模块化的影子;同事在代码跳转时,注意是怎样在上下文之间切换的,思考这种切换技巧。
实验结果: