easyjun 发表于 2012-1-2 01:09:13

实验7的代码

在测试点找不到实验7的代码,视频中的也只能看到部分代码.求完整代码,谢谢!
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,19514,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,
5636,8226,11542,14430,15257,17800
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends

code segment

start:
..........................................................



mov ax,4c00h
int 21h
code ends
end start

小鸟江月 发表于 2012-1-2 01:48:51

小甲鱼不是有课件和源代码可以下载嘛~

laiyihan 发表于 2012-1-2 03:14:17

我的代码比较长:(
assumecs:dm,ds:sj,ss:dz
sjsegment
    db'1975','1976','1977','1978'
    db'1979','1980','1981','1982'
    db'1983','1984','1985','1986'
    db'1987','1988','1989','1990'
    db'1991','1992','1993','1994'
    db'1995'
    dd16,22,382,1356,2390,8000,18000,24486,50065,97479,140417,197514
    dd345980,890827,803530,1183000,1743000,2759000,3753000,4649000,5937000
    dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw11542,14430,15257,17800
    sjends

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

dzsegment
    db 0,0,0
dzends
dmsegment
ks: mov ax,sj
    mov ds,ax
    mov ax,dz
    mov ss,ax
    mov sp,16
    mov ax,sjb
    mov es,ax               
   
    mov bx,0                ;初始化行数变量
    mov bp,84               ;summ起始地址
    mov cx,21               ;初始化S计数器
    mov si,0                ;初始化源数据偏移
s:push cx               ;S计数器保护
    mov cx,2                ;初始化S1计数器
    mov di,0                ;初始化目的数据偏移
s1: mov ax,             ;读入数据year
    mov es:,ax       ;写入数据year
    mov ax,ds:       ;读入数据summ
    mov es:,ax   ;写入数据summ
    add si,2                ;源数据高位字节偏移
    add di,2                ;目的数据高位字节偏移
    loop s1
    add bx,16               ;换行
    pop cx                  ;s计数器还原
    loop s
   
    add bp,84               ;人数起始地址
    mov bx,0                ;初始化行数变量
    mov si,0                ;初始化源数据偏移
    mov cx,21               ;初始化S2计数器
s2: mov ax,ds:       ;读入人数数据
    mov es:,ax       ;写入人数数据
    add si,2                ;下一个源数据偏移
    add bx,16               ;换行
    loop s2

    mov bx,0            ;初始化行数变量
    mov cx,21         ;初始化S3计数器
s3: mov dx,es:    ;高位被除数
    mov ax,es:    ;低位被除数
    mov si,es:   ;除数
    div si
    mov es:,ax   ;写入商
    add bx,16         ;换行
    loop s3
   
    mov ax,4c00h
    int 21h
dmends
end ks

laiyihan 发表于 2012-1-3 01:51:15

之前的是只看书的代码
视频看到一半 改进的代码只用到一个循环assumecs:dm,ds:sj
sjsegment
    db'1975','1976','1977','1978','1979','1980','1981','1982'
    db'1983','1984','1985','1986','1987','1988','1989','1990'
    db'1991','1992','1993','1994','1995'
    dd16,22,382,1356,2390,8000,18000,24486,50065,97479,140417,197514
    dd345980,890827,803530,1183000,1743000,2759000,3753000,4649000,5937000
    dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw11542,14430,15257,17800
sjends

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

dmsegment
ks: mov ax,sj
    mov ds,ax               ;定义数据段
    mov ax,sjb
    mov es,ax               ;定义数据表段
   
    mov bx,0
    mov si,0
    mov bp,84
    mov di,0
    mov cx,21
s:mov ax,ds:          ;读入年份低位地址
    mov es:,ax          ;写入年份低位地址
    mov ax,ds:       ;读入收入低位地址
    mov es:,ax      ;写入收入低位地址
    add si,2
    mov ax,ds:          ;读入年份高位地址
    mov es:,ax      ;写入年份高位地址
    mov ax,ds:       ;读入收入高位地址
    mov es:,ax      ;写入收入高位地址
    add si,2

    mov ax,ds:    ;读入人数地址
    mov es:,ax       ;写入人数地址
    add di,2               

    mov ax,es:      ;读入被除数低位
    mov dx,es:      ;读入被除数高位
    div word ptr es: ;除法运算 除数为人数
    mov es:,ax

    add bx,16               ;换行
    loop s
   
    mov ax,4c00h            
    int 21h               ;中断返回
dmends
end ks 不知道看完视频后 能不能再精简

easyjun 发表于 2012-1-3 02:28:49

代码跟视频中的怎么完全不一样了,84是怎么来的不懂

laiyihan 发表于 2012-1-3 22:58:20

84=54H(我没用十六进制的)
视频的代码是比较详细的
和我第一个差不多吧
因为每个年份('1987')是4个字节 有21个年份 总共84个字节 所以年份总共占了84(54H)个字节 在内存单元的DS:0~~DS:53H(83)处共84个内存单元从54H(84)开始就是收入的数据
DD定义的是双字型数据(4个字节) 也是有21个收入数据 就是84个字节 在内存单元的地址就是DS:54H~~A7H处(A7H=84+84-1-1是因为0也占了一个内存单元)
DW定义的是字型数据(2个字节) 也就是21个人数数据 就是42个字节 在内存单元的DS:A8H~~E9H处
(E9=84+84+42-1 -1是因为0也占了一个内存单元)
所以年份 收入 人数 在内存中的地址就是 DS:0-E9h
年份的起始偏移是0
收入的起始偏移是84(54h)
人数的起始偏移是168(A8h)

easyjun 发表于 2012-1-3 23:32:35

谢谢指点,最后一个计算出来是不是DS:A8H~~0D1H,

laiyihan 发表于 2012-1-4 00:53:32

不是
DS是数据段(书上的标号是data 我的标号是sj(数据的缩写 嘿嘿))就是已知的数据 年份 收入 人数
是不用我们修改的
要求我们要修改的内存是table段(我的标号是sjb(数据表)) 让我们把DS段的年份 收入 人数 分别写到table段中 这才是我们要改的数据段
还有一点 你好像没明白这个实验要我们做什么
其中 DS段的数据排列是21个年份加上21个收入再加上21个人数
我们要做的是把DS段的3个数据 按照表格的形式写入table中 再计算出人均收入
table的数据排列是 每行16个字节前4个字节是年份 空格 4个字节是收入 空格 2个字节是人数 空格 2个字节是人均收入 空格 (每个空格是1个字节)

415968430 发表于 2012-1-5 17:01:52

想想容易做起来难{:1_1:}
页: [1]
查看完整版本: 实验7的代码