. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->端口
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验14,17条代码搞定,原来乘法也可以分离出十位数!  [已解决] 回复[ 2次 ]   点击[ 472次 ]  
hky987654321
[帖 主]   [ 发表时间:2013-09-04 09:31 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
共享! 
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   


程序发展主要历程:  
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 02:26 发表了更短程序,其中,  
     数据段改为: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条。通过除法替代右移,减少了mov cx,4这条代码。联合运用除法、or和add这些已学知识,使设计的数据段发挥了替代ah及cl寄存器、提供除数及结束标识符的作用,并使数据段成了运算场所。

5、hky987654321再一次超越自我,2013-09-04 09:21 发表了更短程序,其中,  
     数据段改为:db '2000/00/00 00:00:00','$',16,0     
            db  9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0,0,'!'  
    代码减至17条。与“18条代码”程序不同的是,通过乘法产生了(ax)*16等同于(ax)左移4位的效果,从ah中取出所需的十位数,而且16位乘法的结果同时使(dx)=0,这样代码中就不需要mov dx,0这条代码了。
hky987654321
[第1楼]   [ 回复时间:2013-09-05 11:27 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
问题解决!
hky987654321
[第2楼]   [ 回复时间:2013-09-05 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
此贴由 贴主 于 [ 2013-09-05 11:28 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved