高级语言如何存放二维数组
高级语言有两种方法在内存中存放二维数组:行主序,列主序。
行主序存储方法
使用行主序(最常用)时,第一行存放在内存块开始的位置,第一行最后一个元素后面紧跟的是第二行的第一个元素。
列主序存储方法
使用列主序时,第一列的元素存放在内存块开始的位置,第一列最后一个元素后面紧跟的是第二列的第一个元素。
汇编语言实现二维数组的方法
用汇编语言实现二维数组时,可以选择其中的任意一种顺序。
x86指令集中二维数组的操作数类型
-
基址 - 变址操作数
-
基址 - 变址 - 偏移量操作数
什么是基址 - 变址操作数
将两个寄存器(称为基址和变址)相加,生成一个偏移地址
格式
[ 基址寄存器 + 变址寄存器 ] ;其中方括号是必须的
作为基址变址寄存器的范围
32位模式下,任一32位通用寄存器都可以用作基址和变址寄存器。
通常情况下避免使用EBP,除非进行堆栈寻址。
使用基址- 变址操作数按行主序方式访问二维数组
-
确定数组起始地址
-
确定行大小
-
确定行索引,索引以0开始
-
确定列索引,索引以0开始
-
如果是非byte类型,确定比例因子
示例:
mov ebx,offset array ;数组起始地址
add ebx,rowsize * index ;数组起始地址 +(行大小 * 行索引)
mov esi,2*type array ;列位置 * 元素大小
mov eax,[ebx + esi] ;精确定位数组元素
什么是基址 - 变址 - 偏移量操作数
用一个偏移量,一个基址寄存器,一个变址寄存器,和一个可选的比例因子,来生成有效地址。
格式
[基址寄存器 + 变址寄存器 + 偏移量] ;偏移量可以为变量名或常量表达式
偏移量 [基址寄存器 + 变址寄存器 * type array] ;偏移量可以为变量名或常量表达式,type array是可选比例因子
作为基址变址寄存器的范围
32位模式下,任一32位通用寄存器都可以用作基址和变址寄存器。
基址 - 变址 - 偏移量的寻址思想
偏移量 = 数组名,基址操作数 = 行 ,变址操作数 = 列
示例: mov eax , table [ ebx + esi*TYPE table ]