一维数组

一维数组也就是平时说的数组,其实还有二维数组,后面会介绍到。

-所有相同大小的元素按顺序存储在内存中的列表

一般形式:数组名字 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]ArrayWArrayW
ArrayW[1]ArrayW+1ArrayW+2
ArrayW[2]ArrayW+2ArrayW+4
ArrayW[3]ArrayW+3ArrayW+6
:::
ArrayW[i]ArrayW+iArrayW+ 2i
ArrayW[i+1]ArrayW+i+1ArrayW+ 2(i+1)
:::
ArrayW[N-1]ArrayW+N-1ArrayW+ 2(N-1)

例如: 数组Arr 里面有五个元素分别是10 -20 30 -40 50

高级语言汇编语言 字节数组和字数组
10Arr[0]Arr + 1*0Arr + 2*0
-20Arr[1]Arr + 1*1Arr + 2*1
30Arr[2]Arr + 1*2Arr + 2*2
-40Arr[3]Arr + 1*3Arr + 2*3
50Arr[4]Arr + 1*4Arr + 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]

01列(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)

0246810121416
182022242628303234
363840424446485052
545658606264666870
727476788082848688
9092949698100102104106
108110112114116118120122124

这就是这个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)

0123456
78910111213
14151617181920
21222324252627
28293031323334
逻辑顺序

以 列为主序

0714212818
152229291623
303101724314
1118253251219
2633613202734

以列为主序以后,我们可以发现这七个数字实际上是每个相差5个地址。所以每次循环加5




例:编写汇编代码,以行为主序,存储的10×10维字数组ArrayB[i][j]中的所有元素都为零。(ArrayB+i×20+j×2)

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏