|
主题 : : 实验14 代码16条 有点另类 再减当如何? [已解决] |
回复[ 4次 ]
点击[ 358次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2014-02-05 16:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
实验14 狠挖掘潜力,代码减至16条90字节。增大数据段,总觉得另类和怪怪的。
两问题:
1、再减代码条数的思路?
2、如果有可能,减到只剩数据段会如何?机器语言?
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 成立
db 0,9,0,0,4ch,0 ;置(ah) = 9 、4ch 及(al) = 0
data ends
code segment
start:mov ax,data ; 1 读取数据段地址
mov ds,ax ; 2 设置数据段
sub bx,bx ; 3 ds:dx指向data:0;本条亦可删除,但仍保留
St_s: mov ax,[bx].22 ; 4 从data中取出指定位置的数据信息
cmp ah,9 ; 5 判断是否读到ah=9及4ch
jnb ok ; 6 读到则去进行输出及返回操作
out 70h,al ; 7 将该单元地址传到地址端口70h
in al,71h ; 8 从数据端口71h取出单元的数据
or [bx].3,al ; 9 分存到数据段中
and byte ptr [bx].3,3fh ;10 分存数据纯化为(30h + 个位)
mul word ptr ds:[20] ;11 左移4位,ah中得纯十位数,并置(dx)=0
add [bx].2,ah ;12 传到data中相加,得其ASCⅡ码
return:add bx,3 ;13 寻址增3个字节
jmp St_s ;14 继续
ok: int 21h ;15 输出时钟及返回
jmp return ;16 转去使ax=4c00h
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2014-02-09 22:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
实验14 代码14条
超越知识的范围,就超越了自我!
assume cs:code
code 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 成立
db 0,9,0,0,4ch ;置(ah) = 9 、4ch 及(al) = 0
dw 0 , seg start ;存放32位地址 cs:0
start:LDS bx,cs:[45] ; 1 ds:bx = cs:0
St_s: mov ax,[bx].22 ; 2 从data中取出数据,存于ax
cmp ah,9 ; 3 是否读到ah=9或4ch
jnb ok ; 4 读到,显示时钟或返回
out 70h,al ; 5 传送单元地址
in al,71h ; 6 取出数据
or [bx].3,al ; 7 分存到数据段中
and byte ptr [bx].3,3fh ; 8 分存数据纯化为(30h + 个位)
mul word ptr ds:[20] ; 9 乘以16,ax左移4位,ah存十位数,并置(dx)=0
add [bx].2,ah ;10 传到data中相加,得其ASCⅡ码
return:add bx,3 ;11 寻址增3个字节
jmp St_s ;12 继续
ok: int 21h ;13 输出时钟或返回
jmp return ;14 转去使ax=4c00h
code ends
end start | | |
|
|
|
|
[第2楼]
[ 回复时间:2014-02-10 10:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
实验14 代码13条,改16为10h后用除法,商、余数为十位数、个位数就十分明显,一次完成两数分离。用16进制数有时很直观的!
assume cs:code
code segment
db '2000/00/00 00:00:00','$',10h ;置10h(即16),8位除数
db 9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0,0 ;置0,使(ah)=0且统一读写寻址
db 0,9,0,0,4ch ;置(ah) = 9 、4ch 及(al) = 0
dw 0 , seg start ;存放32位地址 cs:0 seg为后章知识
start:LDS bx,cs:[44] ; 1 ds:bx = cs:0 LDS指令在杨季文的书中可学
XOR dx,dx ; 2 置0 XOR指令在杨季文的书中可学
St_s:mov ax,[bx].21 ; 3 从data中取出数据,存于ax
cmp ah,9 ; 4 是否读到ah=9或4ch
jnb ok ; 5 读到,显示时钟或返回
out 70h,al ; 6 传送单元地址
in al,71h ; 7 取出数据
div byte ptr ds:[20] ; 8 除以10h,商、余数为十位数(al)、个位数(ah)
add [bx].2,ax ; 9 传到data中相加,得其ASCⅡ码
return:add bx,3 ;10 寻址增3个字节
jmp St_s ;11 继续
ok: int 21h ;12 显示时钟或返回
jmp return ;13 转去使ax=4c00h
code ends
end start | | |
|
|
|
|
[第3楼]
[ 回复时间:2014-02-12 11:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
重点是掌握访问CMOS RAM的方法,显示不是实验14的重点。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2014-02-12 11:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
此贴由 贴主 于 [ 2014-02-12 11:04 ] 结贴。 结贴原因:问题已解决 | | |
|