pax*_*blo 11
我会在一个以汇编语言提供数组查找语义的CPU中留下深刻印象.或者更确切地说,如果它意味着牺牲了更重要的东西,我会很生气.
在汇编中进行数组查找的一般方法是自己进行计算,将2D数组的两个索引转换为一维数组的单个索引,并调整元素大小.例如(伪代码):
ax = cx * major_dimension
ax = ax + dx
ax = ax * element_size
ax = peek[base+ax]
Run Code Online (Sandbox Code Playgroud)
其中major_dimension是2D数组的维度之一(您使用的维度完全取决于数据在内存中的布局方式),element_size是每个元素的大小,base是数组的开头,cx/dx是您的索引吗?重新用来访问数组.
例如,如果a[0-2][0-3]在内存位置有一个3乘4()数组,0x0700并且这些是32位整数:
+--------+--------+--------+--------+
0x0700: | a[0,0] | a[0,1] | a[0,2] | a[0,3] |
+--------+--------+--------+--------+
0x0710: | a[1,0] | a[1,1] | a[1,2] | a[1,3] |
+--------+--------+--------+--------+
0x0720: | a[2,0] | a[2,1] | a[2,2] | a[2,3] |
+--------+--------+--------+--------+
Run Code Online (Sandbox Code Playgroud)
要查找数组元素a[n,m],可以计算主索引乘以4加上次要索引,将其缩放到正确的元素大小(4个字节),然后添加基数.找到元素a[2,1]
addr = base + (n * 4 + m) * 4
= 0x0700 + (2 * 4 + 1) * 4
= 0x0700 + (8 + 1) * 4
= 0x0700 + (9 ) * 4
= 0x0700 + 36
= 0x0700 + 0x24
= 0x0724
Run Code Online (Sandbox Code Playgroud)
然后,这是您用于查找1D阵列的地址.
并且,基于以下评论:
ar db 3dup(3dup(0))
mov ar[bx][si],al
Run Code Online (Sandbox Code Playgroud)
会工作,这是不对的(ar[bx][si]是masm特定的语法等效ar[bx+si]).
所有这一切都是ar使用bx和si寄存器简单地添加地址.它并没有缩放bx或si注册考虑的主要尺寸,它并没有缩放bx+si的元素大小值.所以它只能用于主要维度为1 的二维字节数组,我很确定它会成为一维数组:-)
要为任何情况下工作,你首先需要乘bx或si由主要尺寸,然后两者(取决于所使用的主要尺寸)bx和si由元件尺寸.