在数组内部访问数组的元素 - 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 指令编写算法的方法。
我想知道在汇编中(在我的例子中是 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 指令编写算法的方法。