|
主题 : : 实验7做完了,但是在前几次错误的程序中,发现了一个很有趣的问题,请老师和哥哥姐姐们进来看看! [已解决] |
回复[ 2次 ]
点击[ 454次 ] | |
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33 |
其中:54H为总收入数据在data段中的起始地址
0A8H为公司人数数据在data段中的起始地址
assume cs:code,ds:data
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年的 年份字符串,每个年份字符串都占了两个字的空间
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
stack segment
dd 4 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax;ds->data段
mov ax,table
mov es,ax;es->table段
mov si,0;下一行的指针
mov bp,0;
mov bx,0;年份和总数的指针
mov cx,21;年数21,一次循环处理一年的数据项
s:mov ax,[bx];年份的低位送入AX
mov dx,[bx+2];年份的高位送入DX
mov es:[si+0],ax;低位的年份送入表year列的低位中
mov es:[si+2],dx;高位的年份送入表year列的高位中
mov byte ptr es:[si+4],20H;year后加空格
mov ax,[54H+bx];总数的低位送入AX
mov dx,[54H+bx+2];总数的高位送入DX,54H为总收入数据在data段中的起始地址
mov es:[si+5],ax;把AX放入列summ的低位
mov es:[si+7],bx;把BX放入列summ的高位
div word ptr [0A8H+bp];求平均每人收入,0A8H为公司人数数据在data段中的起始地址
mov es:[si+13],ax;把平均收入放入表??列中
mov byte ptr es:[si+15],20H;空格
mov ax,[0A8H+bp];人数
mov es:[si+10],ax
mov byte ptr es:[si+12],20H
mov byte ptr es:[si+9],20H
add bx,4;指向下个双字
add si,10H;指向下一行
add bp,2
loop s
mov ax,4c00H
int 21H
code ends
end start
用debug执行到这一步
AX=0010 BX=0000 CX=0015 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=142D ES=143B SS=1450 CS=1451 IP=0039 NV UP EI PL NZ NA PO NC
1451:0039 26 ES:
1451:003A 895C07 MOV [SI+07],BX ES:0007=6D6D
-t
AX=0010 BX=0000 CX=0015 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=142D ES=143B SS=1450 CS=1451 IP=003D NV UP EI PL NZ NA PO NC
1451:003D F7B6A800 DIV WORD PTR [BP+00A8] SS:00A8=7E80
默认的段地址不是DS吗?为什么这里给我的是SS?为什么呀?为什么?
下面我不得不改变程序了
我把原来的代码
div word ptr [0A8H+bp];求平均每人收入
mov es:[si+13],ax;把平均收入放入表??列中
mov byte ptr es:[si+15],20H;空格
mov ax,[0A8H+bp];人数
mov es:[si+10],ax
改成了
div word ptr ds:[0A8H+bp];求平均每人收入
mov es:[si+13],ax;把平均收入放入表??列中
mov byte ptr es:[si+15],20H;空格
mov ax,ds:[0A8H+bp];人数
mov es:[si+10],ax
在地址前面加了个DS来显示的指出段地址,不得不这样做了,不这样做的话那个段地址又是SS
了!我倒,这是为什么呢?
我觉得这个程序还有更好的做法,请大家指教,谢谢大家了! | | |