x51zqq 发表于 2015-11-10 02:53:59

【汇编语言】-第八章-实验七

个人有点笨,花的时间长了点,万幸还是解决了{:7_112:}
开始时因为对data段中定义的字符串数据在内存中的表现形式产生了误解,不明白为什么‘1975’在内存中是:31,39,37,35,   后来才明白这是ASCII 码 {:5_109:}   还有一个重要疑问就是不明白在data段中定义的数据 比如年份,收入,雇员各占多少字节   编写代码的时候该如何定位这些数据。这个问题后来在我们亲爱的鱼C上看了很多鱼油以前的帖子在对着书本才一点点明白。所以真的很感谢各位鱼油们谢谢!

下面是写好的图片以及代码↓   开始学不久,希望能和大家一起进步!


代码:

assume cs:codesg,ds:data,es:table

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'
;收入(双字)
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;雇员(字)
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

    dw 11452,14430,15257,17800

data ends
;---------------------------------------写入
table segment

    db 21 dup ('year summ ne ?? ')

table ends
;---------------------------------------写入

;-------------------↓代码↓--------------------
codesg segment
start:mov ax,data
          mov ds,ax                ; ds = data
          mov ax,table
          mov es,ax                ; es = table
          
          mov bx,0                ; data偏移
          mov si,2                ; 年份和收入的后2为偏移
          mov bp,0                ; table行偏移
          mov di,0                ; 雇员偏移
;年份写入          
          mov cx,21                ; 循环21次
        s:mov ax,        ;
          mov es:,ax; 年份前2位给table
          mov ax,;
          mov es:,ax; 年份后2位给table
;收入写入
          mov ax,
          mov es:,ax; 收入前2位给table
          mov ax,
          mov es:,ax; 收入后2位给table
;雇员写入
          mov ax,
          mov es:,ax; 雇员给table
;人均写入          
          mov ax,es:
          mov dx,es:        ; 被除数(直接取得table段的收入值)
          div word ptr es:
          mov es:,ax        ; 商存入table
          
          add bx,4
          add bp,10h
          add di,2
          loop s
          
          mov ax,4c00h
          int 21h

codesg ends
end start

x51zqq 发表于 2015-11-10 03:00:06

{:9_240:} 新手,忙了一晚上终于解决了有点小激动。全无睡意第一时间来鱼C和小伙伴们分享下。 代码写的不好大牛不要笑话呵呵~   希望小伙伴们多多交流共同进步   各位鱼油   晚安....

康小泡 发表于 2015-11-10 09:16:59

不错,给你设置了高亮。小伙伴继续加油哇

langzi23 发表于 2015-11-10 10:03:17

wa 好牛逼

x51zqq 发表于 2015-11-10 18:30:57

康小泡 发表于 2015-11-10 09:16
不错,给你设置了高亮。小伙伴继续加油哇

谢谢版主

x51zqq 发表于 2015-11-10 18:31:28

langzi23 发表于 2015-11-10 10:03
wa 好牛逼

呵呵共同进步{:7_113:}

x51zqq 发表于 2015-11-10 19:39:20

竟然有上首页啊{:5_95:}

zph888 发表于 2015-11-12 22:44:08

本帖最后由 zph888 于 2015-11-13 12:12 编辑

       在实验七这道”大作业“中,发现自己:1、偏移地址算错2、指令DBDDDW不熟悉 , DIV除法指令更是不明白3、DEBUG调试、内容查看没经过训练一知半解。
       因为王爽老师,在我们没有练习除法的基础上,搞突袭布置大作业来检测学员的掌握前期学习的水平,因此初学者本人在不参考,不看鱼C老师实验七视频的情况下,用了5个循环,做了2天仍然只做对75%的内容了(除法死活做不出来)。
       但通过封闭做题,确实收获不小,巩固了前8章,为后面9章扫清了障碍。
       下面是搬了学友的题,来说明: 偏移地址直接用十进制数,可以减少手工换算时间。以供学友参考。
assume cs:code,ds:data,es:table
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,11830000,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

codesegment
start:
      mov ax,data
      mov ds,ax
         
      mov ax,table
      mov es,ax
         
      mov bx,0                  ;控制table行数
      mov si,0
      mov di,0
      mov cx,21                   ;循环21次
         
s:      mov ax,ds:
      mov es:,ax
      mov ax,ds:
      mov es:,ax         ;传送年份,以字传送
         
      mov ax,ds:      
      mov es:,ax   
      mov ax,ds:      
      mov es:,dx          ;传送收入
      
      mov ax,ds:
      mov es:,ax      ;传送雇员数,以字传送

      mov ax,ds:      
      mov dx,ds:      
      div word ptr es:    ;除法 32位÷16位,商保存在AX中
      mov es:,ax             ;AX传送到table中的人均收入
         
      add si,2            ;控制雇员数递增,每循环一次,递加2
      add di,4         ;控制年份、收入递增,每循环一次,递加4
      add bx,16         ;每循环一次,移到下一行
      loop s
         
      mov ax,4c00h
      int 21h
code   ends
end start

zph888 发表于 2015-11-13 12:04:03

实验七中,红框中数据应该程序运行后的数据

dps521 发表于 2015-11-29 12:35:20

过来看看一起学习一起研究一下:smile:smile:smile:smile
页: [1]
查看完整版本: 【汇编语言】-第八章-实验七