小咒 发表于 2013-8-7 00:35:16

第八章实验7

第八章实验7我自己想代码的时候想了有点久,最终差不多用了1个多小时才把这些代码写完
{:5_92:}用了1个多小时才写完这一点点代码没办法人比较笨,大家一起努力学习共同进步
首先我觉得这道实验题想让我们滚顾的知识点在于
伪指令dd,db,dw分别是占用了多少个字节
div除法指令的使用
还有就是多种寻址的方法

我的思路基本上是先计算年份-收入-人员的偏移地址是多少到多少(0-53h),(54h-a7h),(a8h-d1h)
然后再计算table段里面需要填入的具体地址,随后考虑data段分别占用的字节
然后再进行写代码,我写的时候还出了1-2次错误,第一次少定义了一个偏移导致只能寻址雇员数的时候第一次存入3,第二次存入变成9了,为什么我会做错是因为我一开始认为dw也是4字节了

我的代码如下:里面都有注释,看不清楚的可以自己把代码复制到Notepad++或者MASMPlus中看一下
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';0-53h
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;54h-a7h
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800;a8h-d1h
data ends

table segment
db 21 dup ('year summ ne ?? ');0-3年份,4空格,5-8收入,9空格,10-11雇员,12空格,13-14人均收入,15空格
table ends

codesg segment
start:
mov ax,data
mov ds,ax;设定data段地址
mov ax,table
mov es,ax;设定table段地址
mov cx,21;定义循环次数
mov bx,0;bx用来存放data段的偏移地址
mov bp,0;bp用来存放table的行偏移
mov di,0;di用来存放雇员数与人均收入的偏移
mov si,2;因为ax是字形数据,而我们定义的年份与收入都是2个字的
s:mov ax,;取年份的数据前2个字节(因为年份占用了4个字节)
mov es:,ax;存入年份数据前2个字节
mov ax,;取年份数据后2个字节
mov es:,ax;存入年份数据后2个字节
mov ax,;取收入前2个字节
mov es:,ax;存入收入前2个字节
mov ax,;取收入后2个字节
mov es:,ax;存入收入后2个字节
mov ax,ds:;取雇员数
mov es:,ax;存入雇员数
mov ax,;设置被除数
mov dx,;设置被除数
div WORD ptr ds:;取字形数据的除数
mov es:,ax;把商数的结果放入
add di,2
add bx,4
add bp,16
loop s
codesg ends
end start



福禄娃娃 发表于 2013-8-7 08:26:30

谢谢楼主分享!
实现方法应该不止一种

缌唸 发表于 2013-8-14 09:03:37

感谢楼主,很好很实用{:1_1:}

牡丹花下死做鬼 发表于 2013-8-14 10:21:30

O(∩_∩)O谢谢楼主分享啊(*^__^*) 嘻嘻……

缌唸 发表于 2013-8-14 13:26:58

楼主 代码真心好

LinuxDeepin 发表于 2013-9-2 21:25:04

本帖最后由 LinuxDeepin 于 2013-9-2 21:34 编辑

一个小时写完,你厉害,不过你忘了

mov ax,4c00H
int 21H

程序不打算退出了?~~(^-^)~~


小咒 发表于 2013-9-3 02:52:45

LinuxDeepin 发表于 2013-9-2 21:25 static/image/common/back.gif
一个小时写完,你厉害,不过你忘了

mov ax,4c00H


退出代码确实忘记写了{:7_154:}

业余选手 发表于 2013-11-3 11:59:01

assume ds:dataseg, cs:codeseg

dataseg 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,486,778,1001,1442,2258,2793,4038,5636,8228
        dw 11542,14430,15258,17800
dataseg ends

table segment
        db 21 dup ('year sumn ne ?? ')
table ends

codeseg segment

        start:
                mov ax, dataseg
                mov ds, ax
                mov si, 0
               
                mov ax, table
                mov es, ax
                mov di, 0
                mov bx, 0
               
                mov cx, 21
        s:       
               
           movdx, ds:
                moves:, dx
                movdx, ds:
                moves:, dx
               
                mov ax, 84
                mov es:, ax
                mov ax, 84
                mov es:, ax
               
                add si, 4
               
                mov ax, 168
                mov es:, ax
                add bx, 2
                add di, 10H
                loop s
               
                mov ax, 4c00h
                int 21h
codeseg ends

end start

libinqi456 发表于 2013-11-4 15:23:39

{:5_109:}占用了多少个字节

Ъγ:_小ツ雨oο 发表于 2014-8-24 13:37:21

没错误,我看错了。:dizzy:,

gyixue 发表于 2014-8-24 21:32:44

楼主比我快啊

Maoshao 发表于 2015-5-19 13:07:58

没写全    最后除法没写   。。
assume cs:codesg

data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends

table segment
db 21 dup('year summ ne ?? ')
table ends

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

        mov cx,21

s:        push cx
        mov cx,2

s0:        mov ax,
        mov es:,ax
        add bx,2
        add si,2
        loop s0
        inc bx
        mov cx,2

s2:        mov ax,
        mov es:,ax
        add si,2
        add bx,2
        loop s2
        inc bx
        mov ax,
        mov es:,ax
        mov dx
        sub si,4
      add bx,6
        pop cx
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

dys376820508 发表于 2016-9-8 13:01:11

单步调试到 cx=6时,做除法时会提示除法溢出?
页: [1]
查看完整版本: 第八章实验7