数据处理的两个基本问题
思维导图
还是画这样的图,感觉思路清晰一些。新的东西并不多,大多感觉还是对以往问题的一个总结。
综合实验
编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。
思路
具体的思路就是,利用内外循环,大循环循环00-10H-20H这样每一行的数据,小循环循环每个数据项
代码
中具体的字节\字。同时利用idata和si
assume cs:codesg,ds:data
data segment
;0
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;54H
dd 16,22,382,1356,2390,8000,160000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5973000
;A8H
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
codesg segment
;正好印证了两个重点的地方 1.数据在什么地方 2.数据的大小
;算人均收入的那个还没有写--------------------------------------------------------
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax;这里经常把ax写成table了
mov bx,0;bx定位data段,bx year和收入都是四个字节可以公用,但是雇员数是两个字节的没办法公用
mov bp,0;bp定位es段
mov di,0;di用来在循环中服务于雇员数,因为它是两个字节,没办法跟year和outcome公用一个递增寄存器
mov cx,21
overall:
push cx
mov cx,2
mov si,0
year:
;年份的4字节---两个字
mov ax,ds:[bx+si]
mov es:[bp+si],ax
add si,2
loop year
mov cx,2
mov si,0
outcome:
;收入的4字节---两个字
mov ax,ds:[bx+54H+si]
mov es:[bp+5H+si],ax
add si,2
loop outcome
;雇员数---一个字
mov ax,ds:[di+0A8H]
mov es:[bp+0AH],ax
;计算人均收入
mov ax,es:[bp+5H];计算人均收入的,要用es的定位,那偏移量就得按照es的来。最开始写成ds的定位了[bx+54H]了
mov dx,es:[bp+5H+2]
div word ptr es:[bp+0AH]
mov es:[bp+0DH],ax
;所有的空格
;第一次没有考虑到空格是一个字节,这里不应该用16位的,应该用8位的
mov al,' '
mov es:[bp+4H],al
mov es:[bp+9H],al
mov es:[bp+0FH],al
pop cx
add di,2
add bx,4
add bp,16
loop overall
;计算收入
mov ax,4c00h
int 21h
codesg ends
end start