汇编语言中的多维数组(2x2)初始化-Y86

时间:2018-07-28 18:59:26

标签: arrays assembly y86

我是汇编语言的新手,我使用的是一个称为Y86的简单版本,本质上是相同的。我想知道如何以这种格式初始化多维数组,特别是制作2x2。稍后使用2x2,我将添加两个矩阵(在这种情况下为数组)。谢谢!

1 个答案:

答案 0 :(得分:2)

在机器代码中,您可以使用(用于信息存储)CPU寄存器和内存。

寄存器具有固定的名称和类型,它们的使用方式相同,例如,在x86中,您可以执行mov eax, 0x12345678将32b值加载到寄存器eax中。

内存就像连续的字节单元块,每个字节单元都有其自己的唯一物理地址(例如:0、1、2,... mem_size-1)。就像一维字节数组。

无论您想要哪种不同的类型,最后都会以某种方式将其映射到此1D字节数组,因此您必须首先设计该映射的发生方式。

某些映射(例如32位整数)在指令中具有本机映射/支持,因此,例如,您可以通过诸如mov eax,[address]之类的单个指令读取整个32b int,而不必从单个字节中进行组合,但是CPU将为您从内存中的以下地址中读取四个字节:address+0address+1address+2address+3,并将其连接成32位值(在x86 CPU上为little-endian)顺序,因此address+0中的字节位于最终值的最低8位中。

其他映射(例如“ array 2x2”)没有本机支持,因此您必须设计内存布局并相应地编写代码以支持它。对于二维数组,通常使用映射memory_offset = (row * columns_max + column) * single_element_byte_size

就像32位浮点数的16x16矩阵一样,您可以计算内存偏移量(从矩阵数据的开始处,偏移量为0):

    ; eax = column 0..15 (x), ebx = row 0..15 (y), ecx = address of matrix
    shl    ebx, 4    ; y *= 16
    add    eax, ebx  ; index = y * 16 + x
    mov    edx, [ecx + eax*4]   ; read 32 bit element from matrix[y][x]

但是您当然可以自由设计和实现您想要的任何类型的映射...


edit:正如Peter Cordes所指出的那样,某些映射支持某些任务,例如,像上述那样的连续设计的矩阵,在添加两个矩阵的任务中,可以在实现中作为一维256(16x16)元素来处理数组,因为矩阵加法中没有行/列的意义,因此您只需将两者的相应元素相加即可。在乘法中,您必须以更复杂的模式遍历元素,其中行/列很重要,因此必须编写更复杂的代码以遵守2D映射逻辑。


编辑2,为您的问题添加答案:

  

我想知道如何以这种格式初始化多维数组

Eee ...从机器角度看,这没有意义。您只需要在内存保留空间中某个位置代表数组数据,就可以通过简单地将这些值写入内存(通过普通的内存存储指令,例如mov [ebx],eax)来将它们设置为某些初始值,或例如在添加两个固定值矩阵的简单代码中,您可以使用某些指令定义值在.data段中直接定义它们两者,例如在NASM汇编器中(如上所述,用于简单映射):< / p>

; 2x2 32bit integer matrix:
; (14 32)
; (-3  4)
matrix1:
    dd  14, 32, -3, 4

(请查看汇编器文档,以了解哪些指令可用于保留+初始化部分内存)

您要为数据保留哪种存储区(加载时初始化的.data或堆栈,或从OS“堆”动态分配的存储区,...),以及如何使用初始数据由您决定,但与“二维数组”无关,通常分配/初始化代码通常适用于所有类型,例如“连续字节块”,而无需关心数据的内部结构,留给其他功能处理数据的特定元素。