王爽 实验7

搞懂这个题目的意思就花了我半天,只怪本人理解能力太差。

题目意思:题目定义了21个'year summ ne ?? ‘,正好是16个字节,与table中的相对应。首先我还纳闷,1995放到4个字节中还好说,可是5937000如何放到4个字节中呢?5a9786H要如何放到4个字节中呢?原来是这样,00 5a 97 86,恍然大悟,都怪自己一直对啥bit,byte,字,字节等等搞不清楚。然后我又以为要跟书上的表一模一样,百思不得其解,难道我现在的水平还能做出这么高超的表来吗?第二天再看这个题目,突然一下明白过来,原来db 21 dup('year summ ne ?? ')只是开辟了21个16字节的空间,然后将之前定义的种种mov或找个栈做中介push进去就OK了。啊,原来如此。分析的时候大家可以画一个长条图,分成一个一个小块,就像地址图那样,每个小块中写上几个象征性的数字,譬如1975.。。。。。。10000000.。。。。0300.。。。,然后可能会更加明白些吧,我这里就不传图片了,CSDN不知道发什么疯,图片审核N久。声明一下,那个1975并不是真的存在内存中就是那样的数字,我是为了方便才那样写。

为便于理解,大家可以去这里看下结果图:http://download.csdn.net/source/2011848

我也不想这么麻烦,可是CSDN不可以传图片了。

第一种方法:mov(我自己写的哈)

assume cs:codesg,ds:data
  data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    db '1993','1994','1995'                         ;每个年份占4个字节,一共4*21=54h个字节

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000    ;每个收入占4个字节,dd嘛,一共4*21=54h

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800        ;每个雇员数占2个字节,dw嘛,一共2*21=2ah
  data ends

  table segment
   db 21 dup('year summ ne ?? ')        ;16个字节一排,如果你用命令d查看时,会发现有一排一排的year summ ne ??,本程序运行完后就会变成(举一个例子)类似这样:1995 h-Z- -E M- ,看左边就会发现时这样的:31 39 39 35 20 68 97 5a-00 20 88 45 20 4d 01 20 其中31 39 39 35就是1990,20是空格,005a9768就是593700的16进制了,后面的自己推吧
  table ends

  codesg segment
  start: mov ax,data
         mov ds,ax
         mov ax,table
         mov es,ax
        
         mov bx,0
         mov si,0
         mov di,0

         mov cx,21
       s:
         mov ax,ds:[di]
         mov es:[bx],ax
         mov ax,ds:[di][2]
         mov es:[bx][2],ax
         
         mov ax,ds:[di+54h]
         mov es:[bx].5,ax
         mov ax,ds:[di+54h][2]
         mov es:[bx].5[2],ax

         mov ax,ds:[si+0a8h]
         mov es:[bx].10,ax
        
         mov dx,[di+54h][2]
         mov ax,[di+54h]
         div word ptr ds:[si+0a8h]
         mov es:[bx].13,ax

         add bx,16
         add di,4
         add si,2
         loop s
  mov ax,4c00h
  int 21h
  codesg ends
  end start

 

昨天百思不得其解的时候上网看到了一个网友极力推荐的用栈的方法写的一个程序,发现与我的这个思想差不多,不过也复制过来供大家参考。

第二种方法:栈

DATAS  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'
    
              DD        16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
              DD        345980, 590827, 803530, 118300, 184300, 2759000, 3753000, 4649000, 5937000
    
              DW        3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
              DW        11542, 14430, 15257, 17800
       DATAS  ENDS

       TABLE  SEGMENT
              DB        21 DUP ('year summ ne ?? ')
       TABLE  ENDS

      STACKS  SEGMENT
              DB 16 DUP (0)
      STACKS  ENDS

ASSUME    CS:CODES,DS:DATAS,SS:STACKS

       CODES  SEGMENT
      START:
              ;相关寄存器初始化
              MOV       AX,DATAS
              MOV       DS,AX
              MOV       AX,TABLE
              MOV       ES,AX
              MOV       AX,STACKS
              MOV       SS,AX
              MOV       SP,16
    
              MOV       BX,0
              MOV       BP,0
              MOV       DI,0
              MOV       SI,0

              MOV       CX,21

      cycle:  ;使用栈复制年份
              PUSH      [DI].0
              PUSH      [DI].2
              POP       ES:[BP].2
              POP       ES:[BP].0
              
              ;使用栈复制收入
              PUSH      54H.[DI].0
              PUSH      54H.[DI].2
              POP       ES:[BP].7
              POP       ES:[BP].5

              ;使用栈复制雇员数
              PUSH      0A8H.[SI]
              POP       ES:[BP].0AH

              ;计算人均收入
              MOV       AX,ES:[BP].5
              MOV       DX,ES:[BP].7
              DIV WORD PTR ES:[BP].0AH
              MOV       ES:[BP].0DH,AX

              ADD       SI,2H
              ADD       DI,4H
              ADD       BP,10H

              loop cycle
                   

              MOV       AH,4CH
              INT       21H
       CODES  ENDS
END       START

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值