分析:
该实验时之前以来最难的一次试验了,很多第一次都是难以做出来的(大神别见怪。
我们先分析一下数据段,前两个其实都是4个字节,别被db给骗了,因为是字符串,所以4个字节
然后dw为两个字节,你会发现前两个的某个地址为dw地址的两倍。比如1976的地址为4,对应22,但是对应dw中的7地址却为2. 这个时候我们就可以用bx设置为dw的起始地址,然后si+bx为前面两个的起始地址就行了 (si+bx) = 2*bx
然后用bp来确定table的起始地址,因为题目已经给明白第一行为0,第二行为10h,所以每次加10h就ok了
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 '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 ;以上表示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 codesg segment start: mov ax,data mov ds,ax ;ds为data段 mov bx,0 mov si,bx mov ax,table mov es,ax ;es为table段 mov bp,0 mov cx,21 ;循环21次 s: mov ax,0[bx+si] mov es:[bp],ax mov ax,0[bx+si+2] mov es:[bp+2],ax ;移入年份 mov ax,84[bx+si] mov dx,84[bx+si+2] ;因为要除法,所以这样移动 mov es:[bp+5],ax mov es:[bp+7],dx ;移入收入 div word ptr 168[bx] mov es:[bp+13],ax ;先移入人均收入 mov ax,168[bx] mov es:[bp+10],ax ;移入人员数 add bx,2 ;人员数的地址 mov si,bx ;上面两个的地址 add bp,10h loop s mov ax,4c00h int 21h codesg ends end start
结果如下: