搞懂这个题目的意思就花了我半天,只怪本人理解能力太差。
题目意思:题目定义了21个'year summ ne ?? ‘,正好是16个字节,与table中的相对应。首先我还纳闷,1995放到4个字节中还好说,可是5937000如何放到4个字节中呢?5a9786H要如何放到4个字节中呢?原来是这样,00 5a 97 86,恍然大悟,都怪自己一直对啥bit,byte,字,字节等等搞不清楚。然后我又以为要跟书上的表一模一样,百思不得其解,难道我现在的水平还能做出这么高超的表来吗?第二天再看这个题目,突然一下明白过来,原来db 21 dup('year summ ne ?? ')只是开辟了21个16字节的空间,然后将之前定义的种种mov或找个栈做中介push进去就OK了。啊,原来如此。分析的时候大家可以画一个长条图,分成一个一个小块,就像地址图那样,每个小块中写上几个象征性的数字,譬如1975.。。。。。。10000000.。。。。0300.。。。,然后可能会更加明白些吧,我这里就不传图片了,CSDN不知道发什么疯,图片审核N久。声明一下,那个1975并不是真的存在内存中就是那样的数字,我是为了方便才那样写。
为便于理解,大家可以去这里看下结果图:http://download.csdn.net/source/2011848
我也不想这么麻烦,可是CSDN不可以传图片了。
第一种方法:mov(我自己写的哈)
assume cs:codesg,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' ;每个年份占4个字节,一共4*21=54h个字节
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;每个收入占4个字节,dd嘛,一共4*21=54h
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800 ;每个雇员数占2个字节,dw嘛,一共2*21=2ah
data ends
table segment
db 21 dup('year summ ne ?? ') ;16个字节一排,如果你用命令d查看时,会发现有一排一排的year summ ne ??,本程序运行完后就会变成(举一个例子)类似这样:1995 h-Z- -E M- ,看左边就会发现时这样的:31 39 39 35 20 68 97 5a-00 20 88 45 20 4d 01 20 其中31 39 39 35就是1990,20是空格,005a9768就是593700的16进制了,后面的自己推吧
table ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
s:
mov ax,ds:[di]
mov es:[bx],ax
mov ax,ds:[di][2]
mov es:[bx][2],ax
mov ax,ds:[di+54h]
mov es:[bx].5,ax
mov ax,ds:[di+54h][2]
mov es:[bx].5[2],ax
mov ax,ds:[si+0a8h]
mov es:[bx].10,ax
mov dx,[di+54h][2]
mov ax,[di+54h]
div word ptr ds:[si+0a8h]
mov es:[bx].13,ax
add bx,16
add di,4
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
昨天百思不得其解的时候上网看到了一个网友极力推荐的用栈的方法写的一个程序,发现与我的这个思想差不多,不过也复制过来供大家参考。
第二种方法:栈