我们知道,对于字符,在内存中存放的是与其对应的ASCII码值.如对于
'1975',内存中存放的并不是1975本身,而是与字符'1','9','7',
'5'分别对应的ASCII码31,39,37,35,每个字符占一个字节.而对于
数据如0010H,在内存中存放的为其本身.
用-d 命令可查看某段内存中的内容.如-d 3000:0 这里显示了三部分
内容:
左边:每行行首内存单元的地址
中间:相应内存单元存放的数据
右边:若内存单元中的数据为某个字符的ASCII码,则会在该部分显示出
相应的字符,所以我们看到了1975,1976等年份.而对于内存中属
于收入的数据,这些数据并不一定有与其相应的字符(也就是说它
不是某个字符的ASCII码)故在右边没有看到诸如收入16,22等之
类的显示(其实我有点蠢:怎么可能会在右边显示收入哪)但它们仍
存放在相应内存中.
所以本程序没有问题
以下是程序的实现(附有注释)
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
mov ax,table
mov es,ax
mov bx,0 ;bx定位data 段中的数据项
mov bp,0 ;bp定位table表中的行
mov cx,21 ;设置外循环次数
s: mov dx,cx ;保存cx中的值
mov si,0 ;si定位table表中的列
mov cx,2 ;设置内循环次数
s0: mov ax,[bx]
mov es:[bp+si],ax
add bx,2
add si,2
loop s0
mov cx,dx ;恢复cx中的值
add bp,10H
loop s
;该双重循环即为实现年份的输入
;收入及人数的输入与年份的输入
;大致相同,故下面的程序没有一
;一注释
mov bp,0 ;这里未重新设置bx中的值
mov cx,21 ;是因为在上个循环结束时
;bx已经指向了下一个循环
s1: mov dx,cx ;要访问的数据
mov si,0
mov cx,2
s2: mov ax,[bx]
mov es:[bp+si+5],ax
add bx,2
add si,2
loop s2
mov cx,dx
add bp,10H
loop s1
;以上为输入收入
mov bp,0
mov cx,21
s3: mov dx,cx
mov si,0
mov cx,1
s4: mov ax,[bx]
mov es:[bp+si+10],ax
add bx,2
add si,2
loop s4
mov cx,dx
add bp,10H
loop s3
;以上为输入雇员数
mov bx,0
mov bp,0
mov cx,21
s5: mov ax,es:[bp+5] ;该循环为计算
mov dx,es:[bp+7] ;人均收入
mov bx,es:[bp+10]
div bx
mov es:[bp+13],ax
add bp,16
loop s5
mov ax,4c00H
int 21H
code ends
end start