一维数组
一维数组也就是平时说的数组,其实还有二维数组,后面会介绍到。
-所有相同大小的元素按顺序存储在内存中的列表
一般形式:数组名字 DB(DW) 初始值 例:
ArrayW DB 10,20,30,40,50
ArrayA DW 1000,-5000,9000
数组的访问方法:例如现在有个数组a
;-------------------方法1
MOV AL, a[3]
;-------------------方法2
MOV SI, 3
MOV AL, a[SI]
DUP运算符
-当数组元素数量很多并且具有一样的初始值的时候使用
一般格式:重复次数 DUP (初始值) 例:
ArrayB DW 50 DUP (0) ;初始值为0的50个元素
ArrayC DB 10 DUP (?) ;未初始化的10个元素
ArrayD DB 3 DUP (1,-1,2 DUP (0),-2)
ArrayD DB 1,-1,0,0,-2,1,-1,0,0,-2,1,-1,0,0,-2
例如:c DB 5 DUP(9)
就相当于如下定义:c DB 9, 9, 9, 9, 9
另外一个例子:d DB 5 DUP(1, 2)
等同于 d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
一维数组的地址
-数组ArrayW[i]的地址为(ArrayW+i*s);
当是字节数组的时候S=1,当是字数组的时候S=2,
-当增加数组索引(i),字节(DB)数组地址+1;而字(DW)数组地址+2
数组ArrayW的元素 | 字节DB数组(S=1) | 字DW数组(S=2) |
ArrayW[0] | ArrayW | ArrayW |
ArrayW[1] | ArrayW+1 | ArrayW+2 |
ArrayW[2] | ArrayW+2 | ArrayW+4 |
ArrayW[3] | ArrayW+3 | ArrayW+6 |
: | : | : |
ArrayW[i] | ArrayW+i | ArrayW+ 2i |
ArrayW[i+1] | ArrayW+i+1 | ArrayW+ 2(i+1) |
: | : | : |
ArrayW[N-1] | ArrayW+N-1 | ArrayW+ 2(N-1) |
例如: 数组Arr 里面有五个元素分别是10 -20 30 -40 50
高级语言 | 汇编语言 字节数组和字数组 | ||
10 | Arr[0] | Arr + 1*0 | Arr + 2*0 |
-20 | Arr[1] | Arr + 1*1 | Arr + 2*1 |
30 | Arr[2] | Arr + 1*2 | Arr + 2*2 |
-40 | Arr[3] | Arr + 1*3 | Arr + 2*3 |
50 | Arr[4] | Arr + 1*4 | Arr + 2*4 |
例:将字数组ArrayW的元素ArrayW[5]和ArrayW[6]的内容相互替换。
MOV AX,ArrayW+10 ; 把ArrayW[5]存储到AX里
XCHG AX,ArrayW+12 ; 把AX和ArrayW[6]交换
MOV ArrayW+10,AX ; 把AX存到ArrayW[5]里
例:使5个字节数组ArrayW中的每个元素都为零。
MOV ArrayW,0 ; ArrayW[0]里存储0
MOV ArrayW+1,0 ; ArrayW[1]里存储0
MOV ArrayW+2,0 ; ArrayW[2]里存储0
MOV ArrayW+3,0 ; ArrayW[3]里存储0
MOV ArrayW+4,0 ; ArrayW[4]里存储0
二维数组
有两种方法在内存中存放数组的行和列:行主序和列主序
-M×N的二维数组ArrayW[i][j]
0列 | 1列 | … | (N-1)列 | |
0行 | ArrayW[0][0] | ArrayW[0][1] | … | ArrayW[0][N-1] |
1行 | ArrayW[1][0] | ArrayW[1][1] | … | ArrayW[1][N-1] |
: | : | : | : | : |
i行 | ArrayW[i][0] | ArrayW[i][1] | … | ArrayW[i][N-1] |
: | : | : | : | : |
(M-1)行 | ArrayW[M-1][0] | ArrayW[M-1][1] | ArrayW[M-1][N-1] |
行主序 以0行,1行,2行,… ,(M-1)行顺序保存
ArrayW [i] [j]的地址= ArrayW +(i×N×S)+(j×S)
列主序 以0列,1列,2列,… ,(M-1)列顺序保存
ArrayW [i] [j]的地址= ArrayW +(i×S)+(j×M×S)
基址寻址 和 变址寻址模式
-通过将基址寄存器(BX,BP)的内容,变址寄存器(SI,DI)的内容,变量的偏移地址和常量相加来创建操作数的偏移地址
- 变量[基址寄存器] [变址寄存器]: MOV AX,ArrayW[BX][SI]
- [基址寄存器+变址寄存器+变量+常量]: MOV AX,[BX + SI + ArrayW + 2]
- 变量[基址寄存器+变址寄存器+常量]: MOV AX,ArrayW[BX + SI + 2]
- 常数[基址寄存器+变址寄存器+变量]:MOV AX,2[BX + SI + ArrayW]
-使用BX作为第(i)行的地址寄存器,使用SI作为第(j)列的地址寄存器
以 行主序 存储时
ArrayW [i] [j]地址= ArrayW +(i×N×S)+(j×S)= ArrayW +(BX)+(SI)
以 列主序 存放时
ArrayW [i] [j]地址= ArrayW +(i×S)+(j×M×S)= ArrayW +(BX)+(SI)
例:编写以 行主序 存储的7×9二维字数组ArrayW[i][j] 使第5行为0 和使第7列为0的 程序。(ArrayW+i×18+j×2)
0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 |
18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 |
36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 |
54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 |
72 | 74 | 76 | 78 | 80 | 82 | 84 | 86 | 88 |
90 | 92 | 94 | 96 | 98 | 100 | 102 | 104 | 106 |
108 | 110 | 112 | 114 | 116 | 118 | 120 | 122 | 124 |
这就是这个7*9的二维数组。刚开始我觉得很奇怪,第五行不是从72开始的吗?但是这里请注意,列是从0开始算的,行也是从0开始算的!!所以第五行应该是90 这里。 为什么每个间隔2,因为这是字数组。
如果我们要数组array1的第二列的第三个元素,我们可以这样写array1[6*1][2],他的地址是0+6+2=8;实际上二维数组就是把这两个中括号里面的数值相加计算的地址
例:编写 以列为主序,5*7的字节数组ArrayA[i][j],将第四行和第三列设为0的代码。 (ArrayA + i + j×5)
0 | 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 |
以 列为主序
0 | 7 | 14 | 21 | 28 | 1 | 8 |
15 | 22 | 29 | 2 | 9 | 16 | 23 |
30 | 3 | 10 | 17 | 24 | 31 | 4 |
11 | 18 | 25 | 32 | 5 | 12 | 19 |
26 | 33 | 6 | 13 | 20 | 27 | 34 |
以列为主序以后,我们可以发现这七个数字实际上是每个相差5个地址。所以每次循环加5
例:编写汇编代码,以行为主序,存储的10×10维字数组ArrayB[i][j]中的所有元素都为零。(ArrayB+i×20+j×2)