汇编网首页登录博客注册
krenjt的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
最新评论
最新留言
好友圈
文章收藏
友情链接

[2009-05-25 14:24] 王爽<<汇编语言>>实验7

我们知道,对于字符,在内存中存放的是与其对应的ASCII码值.如对于
'1975',内存中存放的并不是1975本身,而是与字符'1','9','7',
'5'分别对应的ASCII码31,39,37,35,每个字符占一个字节.而对于
数据如0010H,在内存中存放的为其本身.
用-d 命令可查看某段内存中的内容.如-d 3000:0 这里显示了三部分
内容:
左边:每行行首内存单元的地址
中间:相应内存单元存放的数据
右边:若内存单元中的数据为某个字符的ASCII码,则会在该部分显示出
     相应的字符,所以我们看到了1975,1976等年份.而对于内存中属
     于收入的数据,这些数据并不一定有与其相应的字符(也就是说它
     不是某个字符的ASCII码)故在右边没有看到诸如收入16,22等之 
     类的显示(其实我有点蠢:怎么可能会在右边显示收入哪)但它们仍
     存放在相应内存中.
所以本程序没有问题
以下是程序的实现(附有注释)
assume cs:code 

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'
   ;以上是表示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个dword型数据

   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个word型数据

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            ;bx定位data 段中的数据项
          mov bp,0            ;bp定位table表中的行
          mov cx,21           ;设置外循环次数

    s:   mov dx,cx           ;保存cx中的值

         mov si,0            ;si定位table表中的列
         mov cx,2            ;设置内循环次数

      s0:   mov ax,[bx]
           mov es:[bp+si],ax
           add bx,2
           add si,2
           loop s0

        mov cx,dx           ;恢复cx中的值
         add bp,10H
         loop s
        ;该双重循环即为实现年份的输入        
         
         ;收入及人数的输入与年份的输入
         ;大致相同,故下面的程序没有一
         ;一注释
 

        
         mov bp,0          ;这里未重新设置bx中的值        
         mov cx,21         ;是因为在上个循环结束时
                              ;bx已经指向了下一个循环
   s1:   mov dx,cx         ;要访问的数据

          mov si,0
         mov cx,2

      s2:   mov ax,[bx]
            mov es:[bp+si+5],ax
            add bx,2
            add si,2
            loop s2

         mov cx,dx
         add bp,10H
         loop s1
         ;以上为输入收入


          mov bp,0
         mov cx,21

   s3:   mov dx,cx

         mov si,0
         mov cx,1

      s4:   mov ax,[bx]
            mov es:[bp+si+10],ax
            add bx,2
            add si,2
            loop s4

         mov cx,dx
         add bp,10H
         loop s3
         ;以上为输入雇员数



          mov bx,0
         mov bp,0
         mov cx,21

   s5:   mov ax,es:[bp+5]      ;该循环为计算
          mov dx,es:[bp+7]      ;人均收入
          mov bx,es:[bp+10]
         div bx
         mov es:[bp+13],ax
         add bp,16
         loop s5

         mov ax,4c00H
         int 21H

code ends 

end start
评论次数(0)  |  浏览次数(349)  |  类型(默认类型) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码