第八章实验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
谢谢楼主分享!
实现方法应该不止一种 感谢楼主,很好很实用{:1_1:} O(∩_∩)O谢谢楼主分享啊(*^__^*) 嘻嘻…… 楼主 代码真心好 本帖最后由 LinuxDeepin 于 2013-9-2 21:34 编辑
一个小时写完,你厉害,不过你忘了
mov ax,4c00H
int 21H
程序不打算退出了?~~(^-^)~~
LinuxDeepin 发表于 2013-9-2 21:25 static/image/common/back.gif
一个小时写完,你厉害,不过你忘了
mov ax,4c00H
退出代码确实忘记写了{:7_154:} 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 {:5_109:}占用了多少个字节
没错误,我看错了。:dizzy:, 楼主比我快啊 没写全 最后除法没写 。。
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 单步调试到 cx=6时,做除法时会提示除法溢出?
页:
[1]