. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->端口
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验14,----->代码最简系列,脉络清晰,方便理解  [已解决] 回复[ 3次 ]   点击[ 544次 ]  
hky987654321
[帖 主]   [ 发表时间:2013-09-05 11:21 ]   [引用]   [回复]   [ top ] 
荣誉值: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
hky987654321
[第1楼]   [ 回复时间:2013-09-05 11:26 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
“程序1 共21条代码,合计86个字节”有笔误,改为:
  程序1 共22条代码,合计86个字节
nasdak
[第2楼]   [ 回复时间:2013-10-13 16:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-10-08 22:55
拜读
hky987654321
[第3楼]   [ 回复时间:2014-02-05 16:28 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
此贴由 贴主 于 [ 2014-02-05 16:28 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved