| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 
 | ; 将每年信息按如下格式填充到table段:; 年份         收入       雇员      人均收入
 ; 4B   空格    4B   空格  2B  空格  2B      空格 (共16字节)
 ; '1975'      16         3        ??
 ; 计算21年的人均收入
 
 assume cs:code
 data segment
 ; 21个 4字节 年份
 db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
 db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
 
 ; 21个 4字节 双字 年收入
 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
 
 ; 21个 2字节 字 雇员数
 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
 ; 每行长16字节
 db 21 dup ('year summ ne ?? ')
 table ends
 
 code segment
 start:
 mov ax,data
 mov ds,ax ; 数据段地址
 
 mov ax,table
 mov ss,ax ; table段地址
 mov bp,0
 
 mov cx,21 ; 循环21次
 
 s:
 mov bx,0  ; 数据段偏移
 mov si,21 ; 根据当前循环计算位置
 sub si,cx ; 计算21个数据中所处位置
 add si,si ; 字的偏移要x2
 
 mov di,si ; 计算双字偏移量
 add di,di ; 双字要x4
 
 mov ax,[bx+di]   ; 年份前2字符
 mov [bp],ax
 add bp,2
 mov ax,[bx+di+2] ; 年份后2字符
 mov [bp],ax
 add bp,2
 mov byte ptr [bp],' '
 inc bp
 
 add bx,84
 mov ax,[bx+di]      ; 收入低字
 mov [bp],ax
 add bp,2
 mov dx,[bx+di+2]    ; 收入高16位,ax里存放32位除法的商
 mov [bp],dx
 add bp,2
 mov byte ptr [bp],' '
 inc bp
 
 add bx,84
 div word ptr [bx+si] ; 年收入除以雇员,ax里有商,是人均收入
 mov dx,[bx+si]   ; 雇员
 mov [bp],dx
 add bp,2
 mov byte ptr [bp],' '
 inc bp
 mov [bp],ax      ; 人均收入
 add bp,2
 mov byte ptr [bp],' '
 inc bp
 loop s
 
 mov ax,4c00h
 int 21h
 code ends
 end start
 
 |