汇编语言8086

use*_*rBI -1 assembly x86-16

我对Assembly 8086有一个问题.我不知道如何使用2D数组.当我这样使用时, mov ar[cx][dx]我得到一个错误,当我想要我们SIDI数组时,它也会返回错误.

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使用bxsi寄存器简单地添加地址.它并没有缩放bxsi注册考虑的主要尺寸,它并没有缩放bx+si的元素大小值.所以它只能用于主要维度为1 的二维字节数组,我很确定它会成为一维数组:-)

要为任何情况下工作,你首先需要乘bxsi由主要尺寸,然后两者(取决于所使用的主要尺寸)bxsi由元件尺寸.

  • @RKRahu,基于索引加位移实际上不是2D数组寻址,它是一个简单的加法寻址模式,你添加(在你的例子中,ar + bx + si.你_still_需要乘以bx或si乘以其中一个维度(并调整数组元素大小)以获得正确的地址. (3认同)