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

低调的

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

踏板7g

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

寄存器具有固定的名称和类型,并且它们的用法类似,例如,在x86中,您可以mov eax, 0x12345678将32b值加载到register中eax

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

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

某些映射(例如32位整数)在指令中具有本机映射/支持,因此您可以通过单个指令(例如)读取整个32b int mov eax,[address],而不必从单个字节进行组合,但是CPU会为您从中读取四个字节存储在地址address+0,,处address+1address+2并将address+3其连接为32位值(在x86 CPU上按小字节序排列,因此from的字节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]

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


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


编辑2,以实际添加问题的答案:

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

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在MS-DOS x86汇编语言中检测16550 UART芯片?

如何用汇编语言初始化数组

有关x86-64汇编语言中的局部变量寄存器的问题

在汇编语言 x86 中将数组从大到小排序

GCD程序x86汇编语言

试图了解我做错了什么 - 链表 Y86 的迭代总和

x86汇编语言中空终止字符串和不以空终止的字符串有什么区别

如何在x86-64汇编语言中使用符号和溢出标志来确定CMOVL和CMOVNG中的“小于”?

使用x86汇编语言打印字符串时出现奇怪字符?

在Windows PC上学习x86汇编语言的诀窍是什么?

用x86 16位汇编语言编写的调试校验和算法

汇编语言(x86):如何创建循环以计算斐波那契数列

x86汇编语言-TEST操作及其对标志的影响

汇编语言X86复制并清除上半部分

如何为 x86 汇编语言选择正确的源代码

x86 汇编语言旋转字符位以加密/混淆

x86汇编语言:如何打印十六进制寄存器值作为十进制输出?

linux x86汇编语言sys_read调用的第一个参数应为0(stdin)

汇编语言 x86 - 在 Linux 上使用 NASM。EDX、ECX、EBX。EAX 整数 80h

在数组,汇编语言中找到间隙的总和

如何在 MIPS 汇编语言中创建双数组?

汇编语言数组

C语言中的常量整数和数组初始化

c语言中数组初始化的困惑

使用 x86 程序集初始化串口

在Yasm x86程序集中初始化结构

用汇编语言x86将32位寄存器[esi]的内存地址移至8位低寄存器

用32位x86汇编语言清除屏幕的最佳方法是什么(视频模式13h)

需要使用Masm以80x86汇编语言连接两个字符串的帮助