实验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 小甲鱼不是有课件和源代码可以下载嘛~ 我的代码比较长:(
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 之前的是只看书的代码
视频看到一半 改进的代码只用到一个循环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 不知道看完视频后 能不能再精简
代码跟视频中的怎么完全不一样了,84是怎么来的不懂 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) 谢谢指点,最后一个计算出来是不是DS:A8H~~0D1H, 不是
DS是数据段(书上的标号是data 我的标号是sj(数据的缩写 嘿嘿))就是已知的数据 年份 收入 人数
是不用我们修改的
要求我们要修改的内存是table段(我的标号是sjb(数据表)) 让我们把DS段的年份 收入 人数 分别写到table段中 这才是我们要改的数据段
还有一点 你好像没明白这个实验要我们做什么
其中 DS段的数据排列是21个年份加上21个收入再加上21个人数
我们要做的是把DS段的3个数据 按照表格的形式写入table中 再计算出人均收入
table的数据排列是 每行16个字节前4个字节是年份 空格 4个字节是收入 空格 2个字节是人数 空格 2个字节是人均收入 空格 (每个空格是1个字节) 想想容易做起来难{:1_1:}
页:
[1]