1 assume cs:code, ds:data, es:table, ss:stacks 2
3 data segment 4 ;年份
5 db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
6 db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
7 db '1993', '1994', '1995'
8 ;收入
9 dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
10 dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
11 ;員工
12 dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
13 dw 11542, 14430, 15257, 17800
14 data ends 15
16 table segment 17 db 21 dup ('year sumn ne ?? ') 18 table ends 19
20 stacks segment 21 dw 0, 0, 0, 0
22 stacks ends 23
24 code segment 25 start:
26 mov ax, data 27 mov ds, ax ;設置DS的段地址
28 mov ax, table 29 mov es, ax ;設置ES的段地址指向table
30 mov ax, stacks 31 mov ss, ax ;設置SS的段地址
32 mov sp, 8 ;設置SP的棧頂指針
33 mov si, 0
34 mov di, 0
35 mov cx, 21 ;設置最外層的循環次數為21次
36 s:
37 push cx ;利用棧來保護最外層的循環
38 mov cx, 2 ;設置年份和收入的循環次數為2次,因為數據結構邏輯上一樣,所以可以在一次循環中同時處理
39 mov bx, 0
40 s1:
41 mov ax, ds:[0+si+bx] ;0看作是數據段中年份的起始地址
42 mov es:[0+di+bx], ax ;0看作是table段中年份的起始地址
43 mov ax, ds:[84+si+bx] ;84看作是數據段中收入的起始地址
44 mov es:[5+di+bx], ax ;5看作是table段中收入的起始地址
45 add bx, 2
46 loop s1 47 add si, bx ;讓si來記錄走過的字節數,保證在修改table段中的下一行時數據是正確的
48 push si ;想讓si同時也處理員工的數據
49
50 mov ax, si ;處理員工的數據
51 mov dl, 2
52 div dl ;因為年份和收入處理時字節長度相同,而員工是它們的一半,所以讓si/2后再減2
53 mov si, ax 54 sub si, 2 ;減2就可以對應到數據段員工的數據
55 mov ax, ds:[168+si] ;168看作是數據段中員工的起始地址
56 mov es:[10+di], ax ;10看作是table段中員工的起始地址
57 pop si ;把si真正的值還原回去,保證下次年份和收入能正常處理
58
59 ;處理人均收入的數據
60 mov dx, es:[7+di];被除數的高位
61 mov ax, es:[5+di] ;被除數的低位
62 div word ptr es:[10+di] ;平均收入
63 mov es:[13+di], ax 64
65 add di, 16
66 pop cx 67 loop s 68
69 mov ax, 4C00H 70 int 21H 71 code ends 72
73 end start
本人最近剛開始學匯編語言,以上代碼是按照我自己的理解寫的,可能不夠優化,若有疑問請評論指正,謝謝!