. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
主题 : :  绝了!比置顶程序还要牛的程序,不另外定义段,只用23条汇编指令完成程序要求。比最牛程序少用了七行代码。  [待解决] 回复[ 66次 ]   点击[ 6561次 ]  
netson
[帖 主] [ 发表时间:2009-07-02 10:50 ] 
荣誉值:0
信誉值:0
注册日期:2008-09-26 07:46
code segment 
start:mov ax,data 
      mov ds,ax 
      mov bx,0 
      mov si,0a8h 
      mov ax,table 
      mov ss,ax 
      mov bp,0 
      mov cx,21 
    s:mov ax,[si] 
      mov [bp+0ah],ax 
      mov ax,[bx] 
      mov dx,{bx+2} 
      mov [bp],ax 
      mov [bp+2],dx 
      mov ax,[54h+bx] 
      mov dx,[56h+bx] 
      mov [bp+05h],ax 
      mov [bp+07h],dx 
      div word ptr [bp+0ah] 
      mov [bp+0dh],ax 
      add bx,4 
      add si,2 
      add bp,10h 
      loop s 
      mov ax,4c00h
      int 21h
code ends 
end start 
我的QQ:479488993       我的博客:http://www.asmedu.net/blog/user/usermain.jsp?neighborId=14266  希望与热爱技术的人为伍。
lelmon
[第16楼] [ 回复时间:2010-07-22 21:15 ] 
荣誉值:0
信誉值:0
注册日期:2010-07-22 20:52
为了说说我的看法只好注册个号了。。。
楼主的有一行代码错了,     mov dx,{bx+2}  应该是mov dx,[bx+2]
不过这个不是大问题,我觉得最不好的地方是你用了SS,也就是把默认的堆栈当普通数据寄存用了,感觉不规范。。。
3楼的思路是对的,可惜基本功。。。竟然写出了mov es:[si+5] 这样的句子,后边的,ax呢?所以要多写多练习,尤其是你没有注释和分段,这样的程序大了之后很难读
6楼的没用div就做出来了让我惊讶,很仔细地看完,发现你没看清题目,请继续审题。。。
7楼的不知道你们试了没有,肯定出问题,因为他把收入跟员工数的顺序弄反了,估计是学习了那个很多push例子的某位牛人的思路,可惜没有深刻理解为什么那位牛人没有用ax而用了dx做传递,不过只要把顺序调过来就是这个版最好的源码
8楼的没话说,确实很好,除了结构和注释上应该努力,养成好习惯,其他perfect,尤其是学了2天写出来的,很强大。。。
assume cs:code, ds:data, es:table

        data segment
                db '1975','1976','1977','1978','1979','1980','1981','1982'
                db '1983','1984','1985','1986','1987','1988','1989','1990'
                db '1991','1992','1993','1994','1995'
                ;以上是表示21年的21个字符串
                
                dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
                dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
                ;以上是表示21年公司总收入的21个双字型数据
                
                dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
                dw 11542,14430,15257,17800
                ;以上是表示21年公司雇员人数的21个字型数据
        data ends
        
        table segment
                db 21 dup ('year summ ne ?? ')
        table ends
        
        
        code segment
        
        start:        
                
                mov ax,data
                mov ds,ax
                mov ax,table
                mov es,ax                ;初始化数据和表格段地址

                mov bx,0
                mov si,0
                mov di,0                ;初始化偏移量,bx是表格行偏移,si是年份字偏移,di是年份双字偏移

                
                mov cx,21                ;初始化循环计数器
        s:        
                mov ax,[di+0]
                mov es:[bx],ax
                mov ax,[di+2]
                mov es:[bx+2],ax        ;对年份的处理
                
                mov ax,168[si]
                mov es:[bx+10],ax        ;对雇员的处理

                mov ax,84[di]
                mov es:[bx+5],ax
                mov dx,86[di]
                mov es:[bx+7],dx        ;对总收入的处理,使用dx是因为不用重复赋值
                
                div word ptr es:[bx+10]
                mov es:[bx+13],ax        ;对平均收入的处理

                add si,2
                add bx,16
                add di,4                ;偏移量增值
        loop s
        
                mov ax,4c00h
                int 21h
        code ends
        
end start
这个是我写的,第一次写的没这么好,吸收了很多牛人的例子相信是不用push里最好的之一了。。。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved