|
主题 : : 实验14,17条代码搞定,原来乘法也可以分离出十位数! [已解决] |
回复[ 2次 ]
点击[ 472次 ] | |
荣誉值: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这条代码了。 | | |