|
发表于 2012-3-27 16:46:45
|
显示全部楼层
本帖最后由 莫名其妙 于 2012-3-27 17:15 编辑
首先 给你看下你自己的代码 (有些地方我看的时候按照我的习惯改了点不影响你的思路)assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1882','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,197514
dd 11542,14430,15257,17800
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
code segment
strat: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov di,0
mov si,0
mov bp,0
mov cx,21
s: mov ax,[di]
mov es:[bx],ax
add di,2
mov ax,[di]
add di,2
;mov es:[bx+2],ax ;年份入es
mov ax,ds:[08ah+bp] ;这里是0a8h 人数 而且这个bp 也可以用di 变量代替 因为你前面+了一个常量确定了开始位置
add bp,2
mov es:[0ah+bx],ax
mov ax,[54h+si]
add si,2
mov dx,[54h+si]
mov es:[5+bx],ax
mov es:[7+bx],dx ;收入
div word ptr ds:[54h+bp] ;这里除以人数 你的 ds:[54h+bp] 指向的也不是人数阿
mov es:[0dh+bx],ax ;平均工资入es
add bx,10h
loop s
mov ax,4c00h
int 21h
code ends
end strat
严重的影响程序正确的就是那句除法 没找对除数!
还有比较有意思的问题就是
mov ax,[di]
mov es:[bx],ax
add di,2 ;
mov ax,[di] 为什么要 add di,2 不直接写成 mov ax,[di+2]
add di,2
而且
mov ax,[54h+si] 这里你都已经定了54h这个位置了 下面的si +2
add si,2
mov dx,[54h+si] 2也是常数为什么不直接写成56h+si
mov es:[5+bx],ax
mov es:[7+bx],dx ;收入
这个程序一趟是按照思路写出來了
但是让人看起来很累 有些你找到地方的直接可以用idate常量表示的
你还要增加一句add 给加到变量上
这样写一旦你疏忽一个位置 就可能整个程序数据错位一大截
程序写出來要根据思路增加空格 空行 方便以后注释 或者自己看的时候明白 上一个段是进行什么操作
找准一个位置 用变量+常数来指向 然后在前面的代码都执行完以后统一对变量进行增加减少操作
程序还有错的地方 应该是某个地方加到后来加错了 时间关系给你发一段差不多的代码你对比下(以前一个兄弟发出來要求精简的)assume cs:code
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,1183000,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
code segment
start:mov ax,data
mov ds,ax ;data段地址与ds挂钩
mov ax,table
mov es,ax ;satle段地址与ex挂钩
mov cx,21 ;循环次数21
mov di,0
mov bx,0
mov si,0 ;初始化
s: mov ax,[bx]
mov es:[di],ax
mov ax,2h[bx]
mov es:2h[di],ax ;导入table段年份数据
mov ax,54h[bx]
mov es:[5+di],ax
mov dx,56h[bx]
mov es:[7+di],dx ;导入table段收入数据
mov ax,0a8h[si]
mov es:[0ah+di],ax ;导入table雇员数
mov ax,es:[5+di]
mov dx,es:[7+di]
div word ptr es:[0ah+di] ;计算平均工资
mov es:[0dh+di],ax ;商存入内存
add bx,4 ;data段年份收入偏移地址递增4
add si,2 ;data段雇员数偏移递增2
add di,16 ;table段递增一行
loop s
mov ax,4c00h
int 21h
code ends
end start
|
|