在数组内部访问数组的元素 - Y86 程序集

Accessing Elements of an Array inside of an Array - Y86 Assembly

我想知道在汇编中(在我的例子中是 Y86),是否可以在数组中包含一个数组?如果是,我将如何访问该数组中的元素。我知道您取消引用数组以获取它们的元素,但这仅适用于堆栈中的一个数组。有没有办法在数组内部获取数组内部的元素。

示例,因为这很难解释:

元素的正常抓取:

 array1:
    .long 0x0
    .long 0x0
    .long 0x0
    .long 0x0

 Main:  
   pushl %ebp 
   rrmovl %esp,%ebp
   irmovl array1,%edx       #store array1 on the stack
   pushl %edx
   mrmovl (%edx), %eax      #get the first element of array1
   rrmovl %ebp, %esp
   popl %ebp
   ret

现在说我有这个:

 array1:
    .long 0x0
    .long 0x0
    .long 0x0
    .long 0x0

 array2:
    .long array1

我可以访问 array2 元素一然后访问 array1 的元素吗?

pushl %edx不是数组入栈,而是第一个元素的内存地址

在你的另一个例子中array2的第一个元素是32位整数值,等于array1的内存地址,所以在C语言术语中array2是数组指针。

当您将 array2 的第一个元素提取到某个寄存器中时,其中包含 "pointer"(内存地址),通过从该地址提取值,您将提取 [=14] 的第一个元素=](或者您可以通过一些偏移量修改它以获取更多元素)。

这个"array of pointers to arrays"模式经常被用在你有多个不同长度的same/similar类型的数组并且你想在内存中连续存储它们,例如:

array0:
  .long 1, 2, 3
array1:
  .long 4
array2:
  .long 5, 6, 7, 8
array3:
  .long 9, 10
; notice the values in memory form a continuous block of 10 long values,
; so you can also access them through "array0" as single array of 10 values

mainArray:
  .long array0, array1, array2, array3

现在,如果您想要值“[2, 3]”,即值“8”,您不能像矩阵 16x16 示例中那样简单地将行值 2 乘以 "column size",因为行不没有固定长度,所以你会首先计算 mainArray 的偏移量,比如(我将使用 x86 AT&T 语法,因为我不知道 Y86,但你应该能够理解,因为它们基本上是相同的指令,只是 Y86 的指令集更有限,而且语法更冗长和神秘,指令名称的 prefix/suffix 部分更多):

; edi = 2 (row), esi = 3 (column)
movl   mainArray(, %edi, 4), %ebx  ; ebx = mainArray[2] (*4 because pointers are 32 bit)
  ; (in x86 AT&T syntax the target memory address is "edi*4 + mainArray")
  ; here ebx = array2 (and "array2" is symbolic name for memory address value)
  ; it is NOT whole array in single register, just the memory address of first element
movl   (%ebx, %esi, 4), %eax       ; eax = 8 (array2[3]) (again *4 because longs are used)
  ; (the target memory address is "ebx + esi*4")

很抱歉没有使用 y86,但正如我所说,我不知道它...如果您很难理解 x86 示例,请尝试在评论中描述您的困难,我最终可能会尝试修复y86 的语法,或者其他人可能会建议修复...


Am I able to access array2 element one and then access array1's elements?

是的,当然,那些值只是普通的 32 位整数(在你的 y86 平台上也是内存地址),所以你当然可以从顶层数组中获取子数组的地址,然后获取值从该子数组地址到达"value"。尝试检查调试器,定义数组后内存的外观,以及这些值如何表示原始源代码。

程序集有点简单和琐碎,在其中编写复杂的抽象是相当 difficult/tedious,但只要我们谈论单指令或内存访问,就期望它是超级简单。如果你看到那里有些复杂,你可能误解了引擎盖下发生的事情,它只是 0/1 位值,并稍微移动它们(通常是常见的数量,如 8、16、32 或 64,对于其他组您通常需要几条指令才能获得所需的结果,而上面的指令本身就支持 byte/short/long/...)。复杂性来自仅使用简单 copy/plus/minus 指令编写算法的方法。