|
主题 : : 实验14,----->代码最简系列,脉络清晰,方便理解 [已解决] |
回复[ 3次 ]
点击[ 560次 ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
在追求代码最简洁过程中,自己编写下四个不同程序,它们均按“年/月/日 时:分:秒”格式,显示当前日期、时间。为方便理解,“汇编”如下:
- - - - - - - - - - - - - - - -
程序1 共21条代码,合计86个字节
assume cs:code
data segment
db '2090/80/70 40:20:00','$' ;在相应位置设置所需信息
data ends
code segment
start: mov ax,data
mov ds,ax
sub dx,dx ;设置ds:dx指向data:0
sub bx,bx
mov cx,4
St_s: mov al,[bx].2 ;从data中取出指定位置的数据信息
mov byte ptr [bx].2,'0' ;将该位置数据置字符'0',即30h
sub al,30h ;从读取的ASCⅡ码中剥离出单元地址
mov dl,al ;将其暂存,备用于读0
out 70h,al ;将该单元地址传到地址端口70h
in al,71h ;从数据端口71h取出单元的数据
mov ah,al ;复制,为数据分离作准备
shr al,cl ;右移4位,分离出高4位的十位数
and ah,00001111b ;and运算纯化出低4位的个位数
add [bx].2,ax ;将十位数和个位数一并传到data中相加,得ASCⅡ码
add bx,3 ;寻址增3个字节
cmp dx,0 ;读0
jne St_s ;判断结束标识符0
mov ah,9 ;置9号子程序
int 21h ;用int 21h输出字符串
mov ax,4c00h
int 21h
code ends
end start
- - - - - - - - - - - - - - - -
程序2 共19条代码,合计95个字节
assume cs:code
data segment
db '2000/00/00 00:00:00','$' ;将单元地址从存放时间处分出
db 9,5,5,8,5,5,7,5,5,4,5,5,2,5,5,0,5,5,'!' ;新置结束标识'!',用两个5区隔以统一读写寻址
data ends
code segment
start: mov ax,data
mov ds,ax
sub dx,dx ;设置ds:dx指向data:0
sub bx,bx
mov cx,4
St_s: mov al,[bx].20 ;从data中取出指定位置的数据信息
out 70h,al ;将该单元地址传到地址端口70h
in al,71h ;从数据端口71h取出单元的数据
mov ah,al ;复制,为数据分离作准备
shr al,cl ;右移4位,分离出高4位的十位数
and ah,00001111b ;and运算纯化出低4位的个位数
add [bx].2,ax ;将十位数和个位数一并传到data中相加,得ASCⅡ码
add bx,3 ;寻址增3个字节
cmp byte ptr [bx].20,'!'
jne St_s ;判断结束标识符'!'
mov ah,9 ;置9号子程序
int 21h ;用int 21h输出字符串
mov ax,4c00h
int 21h
code ends
end start
- - - - - - - - - - - - - - - -
程序3 共18条代码,合计96个字节
assume cs:code
data segment
db '2000/00/00 00:00:00','$',16 ;新置16,作为8位除数
db 9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0,0,'!' ;将区隔数置为0,使被除数(ax)中(ah)=0
data ends
code segment
start: mov ax,data
mov ds,ax
sub dx,dx ;设置ds:dx指向data:0
sub bx,bx
St_s: mov ax,[bx].21 ;从data中取出指定位置的数据信息,存于ax
out 70h,al ;将该单元地址传到地址端口70h
in al,71h ;从数据端口71h取出单元的数据
or [bx].3,al ;or运算使30h及存入数据的个位均得保存
and byte ptr [bx].3,00111111b ;and运算清除残余使数据纯化为(30h + 个位)
div byte ptr ds:[20] ;除以16,效同al右移4位得十位数
add [bx].2,al ;传到data中相加,得其ASCⅡ码
add bx,3 ;寻址增3个字节
cmp byte ptr [bx].21,'!'
jne St_s ;判断结束标识符 '!'
mov ah,9 ;置9号子程序
int 21h ;用int 21h输出字符串
mov ax,4c00h
int 21h
code ends
end start
- - - - - - - - - - - - - - - -
程序4 共17条代码,合计94个字节
assume cs:code
data segment
db '2000/00/00 00:00:00','$',16,0 ;置16和0,作为16位乘数的低8位与高8位
db 9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0,0,'!' ;置0使相乘后(dx)=0成立
data ends
code segment
start: mov ax,data
mov ds,ax
sub bx,bx
St_s: mov ax,[bx].22 ;从data中取出指定位置的数据信息
out 70h,al ;将该单元地址传到地址端口70h
in al,71h ;从数据端口71h取出单元的数据
or [bx].3,al ;or运算使30h及存入数据的个位均得保存
and byte ptr [bx].3,00111111b ;and运算清除残余使数据纯化为(30h + 个位)
mul word ptr ds:[20] ;乘以16,等同于ax左移4位后,在ah中得十位数,同时置(dx)=0
add [bx].2,ah ;传到data中相加,得其ASCⅡ码
add bx,3 ;寻址增3个字节
cmp byte ptr [bx].22,'!'
jne St_s ;判断结束标识符'!'
mov ah,9 ;置9号子程序
int 21h ;用int 21h输出字符串
mov ax,4c00h
int 21h
code ends
end start | | |