0.前言

书上告诉我们此程序是到目前为止的最复杂的程序,它几乎使用到了我们以前学到的所有的知识与编程技巧。所以,这个程序是对我们以前学习的最好的实践。

题目的目的是要将我们在data段定义好的数据,有规律的如表格一样存入table段中,我们可以写出下列的代码。此过程是将结构化数据变成另一种结构排列的形式,结构化处理与结构化访问的思想在下面的代码中表现出来。

1.源码实现

masm中标准的三个段:code data stack
再用不同的寄存器去表示不同的数据的位置

1
2
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
83
84
85
86
87
88
89
90
91
assume cs:code,ds:data,ss:stack

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个字符串 year


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数据 sum

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
;0123456789ABCDEF
db 21 dup ('year summ ne ?? ')
table ends

stack segment stack
db 128 dup (0)
stack ends

code segment

start:
mov ax,stack
mov ss,ax
mov sp,128

mov ax,data
mov ds,ax

mov ax,table
mov es,ax

mov si,0 ;year
mov di,84 ;money
mov bx,168 ;pnumber
mov bp,0 ;result

mov cx,21
inputTable:
;0123456789ABCDEF
;db 21 dup ('year summ ne ?? ')

;移动年份
push ds:[si]
pop es:[bp]
push ds:[si+2]
pop es:[bp+2]

;移动年收入 不能使用栈,因为之后我们要进行除法运算
;push ds:[di]
;pop es:[bp+5]
;push ds:[di+2]
;pop es:[bp+7]
mov ax,ds:[di]
mov es:[bp+5],ax
mov dx,ds:[di+2]
mov es:[bp+7],ax


push ds:[bx]
pop es:[bp+0AH]

div word ptr ds:[bx] ;div命令是将dx与ax组成的数去除以div后的操作数
;计算结果的保存:ax装商,dx装余数
;如果div是8位除法,那么被除数用ax存
;计算结果的保存:al装商,ah装余数
mov es:[bp+0DH],ax

add si,4
add di,4
add bx,2
add bp,16
loop inputTable ;处理下一年


mov ax,4C00H
int 21H

code ends

end start

2.结果显示

result

3.收获感悟

在汇编语言的学习中,我们要明白三件事:1、数据从哪来,2、数据要做什么操作,3、数据到哪里去,通过前八章的学习,我们应该要学会结构化数据的思想。如《数据结构》课程就是在教授如何将数据结构化存储。结构化存储能让我们更加高效的利用并运算数据。