Assembly 如何在部件x86中访问二维阵列

Assembly 如何在部件x86中访问二维阵列,assembly,x86,Assembly,X86,如何在装配中使用二维阵列?我在C中声明了int-array[100][2],我想在C中的汇编中访问例如array[4][0] array[i][j] 同: *(*(array + i) + j) 在C中添加指针时,它会自动考虑所指向类型的大小。在汇编中不是这样的,所以你必须自己做 基本公式如下: (offsetof(array) + (sizeof(int) * i)) + (sizeof(int) * j) 由于int几乎肯定是4个字节,因此程序集等效于: int temp = arra

如何在装配中使用二维阵列?我在C中声明了
int-array[100][2]
,我想在C中的汇编中访问例如
array[4][0]

array[i][j]
同:

*(*(array + i) + j)
在C中添加指针时,它会自动考虑所指向类型的大小。在汇编中不是这样的,所以你必须自己做

基本公式如下:

(offsetof(array) + (sizeof(int) * i)) + (sizeof(int) * j)
由于
int
几乎肯定是4个字节,因此程序集等效于:

int temp = array[4][0];
将是:

mov  eax, DWORD PTR [array+16]

因为(4*4)+(0*4)==16。“2d”数组实际上是数组的数组。现在试着在纸上画出这样一个数组在内存中的样子,它应该是自然产生的。顺便问一下,为什么要有一个由单个元素组成的数组?为什么不干脆用
int-array[100]
来代替呢?因为我需要保存两个整数,一个在'array[0][0]'中,另一个在'array[0][1]中,需要[access]
array[0][0]
[&]
array[0][1]
编写一个数组映射函数。如果不熟悉,用谷歌搜索它。:)非常感谢您的回答,我实际上使用visual studio,C和汇编内联,我还有其他问题,它是相反的,我如何将int分配给汇编中的数组?例如,我在寄存器eax中有一个数字,我想把它放在位置数组[0][1]中。请注意,虽然这是正确的,但请记住,如果
array
是一个数组数组,则在将
array[i]
转换为指向
array[i]
的第一个元素的指针时,会引入隐式take地址,因此,实际的伪代码类似于
*(type*)和*(array+i)+j)
,即
*(type*)(array+i)
。颠倒操作数的顺序,@Renzo:
mov DWORD PTR[array+16],eax
。任何一本关于汇编语言的书都会告诉你,在英特尔语法中,你有:
操作码目的地,source