. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->端口
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验14,18条代码搞定,少一条代码真难!  [已解决] 回复[ 3次 ]   点击[ 459次 ]  
hky987654321
[帖 主]   [ 发表时间:2013-09-04 02:26 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
在家共享。
assume cs:code 
data segment 
   db '2000/00/00 00:00:00','$',16              ;新增16作除数
   db  9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0,0,'!'  ;置0使被除数ax成立
data ends 
code segment 

start: mov ax,data 
mov ds,ax 
mov dx,0                        ;设置ds:dx指向data:0 
sub bx,bx          
St_s: mov ax,[bx].21            ;从data中取出指定位置的数据信息 
out 70h,al                      ;将该单元地址传到地址端口70h 
in  al,71h                      ;从数据端口71h取出单元的数据 
or  byte ptr [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 


程序发展主要历程: 
1、ouxmm(zhihuimao 帖中17楼)在2011-01-11 22:59回复的程序中使用的 
     数据段:db 9,0,'/',8,0,'/',7,0,' ',4,0,':',2,0,':',0,0,'$'  
    代码为22条(实际可减至21条)。此时,代码数量开始有了极限的感觉。感叹之余,或许会问还能更少吗?
 
2、ruder 在2011-01-26 19:42实现了更少。在其帖中发表程序的 
     数据段:db 9, ' /', 8, ' /', 7, '  ', 4, ' :', 2, ' :', 0, ' $'  
    代码减至20条。首次将ah与al放到ax中一并处理,不再是add ah,30h和add al,30h这样处理。 

3、hky987654321在两年半后,即2013-09-02 21:33也实现了更少 ,在发表的上述程序中, 
     数据段:db '2000/00/00 00:00:00','$',9,5,5,8,5,5,7,5,5,4,5,5,2,5,5,0,5,5,'!'  
    代码减至19条。主要通过设计适当的数据段,将ruder程序中必须在代码段处理的add ax,   0011000000110000b,转移到数据段中运算(add [bx].2,ax ),使代码数量进一步减少。

4、hky987654321紧接着超越了自我,2013-09-04发表了更短程序,其中, 
     数据段:db '2000/00/00 00:00:00','$',16    
            db  9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0,0,'!'  
    代码减至18条。主要通过除法替代右移,减少了对cl赋值这条代码。联合运用除法、or和add这些已学知识,使设计的数据段发挥了替代ah及cl寄存器、提供除数及结束标识符的作用,并使数据段成了运算场所。
hky987654321
[第1楼]   [ 回复时间:2013-09-04 09:35 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
还可以用乘法,再将mov dx,0这条代码删除。
hky987654321
[第2楼]   [ 回复时间:2013-09-04 09:37 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
问题已解决,17条代码可实现。
hky987654321
[第3楼]   [ 回复时间:2013-09-04 09:38 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
此贴由 贴主 于 [ 2013-09-04 09:38 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved