. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->端口
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验14  代码16条 有点另类  再减当如何?  [已解决] 回复[ 4次 ]   点击[ 358次 ]  
hky987654321
[帖 主]   [ 发表时间: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
hky987654321
[第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
hky987654321
[第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
hky987654321
[第3楼]   [ 回复时间:2014-02-12 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
重点是掌握访问CMOS RAM的方法,显示不是实验14的重点。
hky987654321
[第4楼]   [ 回复时间:2014-02-12 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
此贴由 贴主 于 [ 2014-02-12 11:04 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved