Pointers 命令中的x86指针
我是x86新手 我知道这种带指针的东西意味着什么Pointers 命令中的x86指针,pointers,x86,Pointers,X86,我是x86新手 我知道这种带指针的东西意味着什么 *command* %eax, %ebx 但是这些有什么不同,它们意味着什么 *command* %eax, (%ebx) *command* (%eax), %ebx *command* (%eax, %ebx, 4), %ecx 我认为您的问题是,“寄存器名称周围的括号表示什么/做什么?”在较高级别上,括号表示从中的内存地址执行加载,并在指令中使用该值。即,鉴于 *command* %eax, %ebx 直接对%eax和%ebx寄存器中
*command* %eax, %ebx
但是这些有什么不同,它们意味着什么
*command* %eax, (%ebx)
*command* (%eax), %ebx
*command* (%eax, %ebx, 4), %ecx
我认为您的问题是,“寄存器名称周围的括号表示什么/做什么?”在较高级别上,括号表示从中的内存地址执行加载,并在指令中使用该值。即,鉴于
*command* %eax, %ebx
直接对%eax
和%ebx
寄存器中的值进行操作
*command* (%eax), (%ebx)
从%eax
和%ebx
指向的内存中加载值并对其进行操作。实际上,括号的变体比您列出的要多。有关它们的说明(包括您询问的最后一个说明示例),请选中
希望有帮助。如果您还有任何问题,请随时发回。我想您的问题是,“寄存器名称周围的括号表示什么/do?”在较高级别上,括号表示从中的内存地址执行加载,并在指令中使用该值。即,鉴于
*command* %eax, %ebx
直接对%eax
和%ebx
寄存器中的值进行操作
*command* (%eax), (%ebx)
从%eax
和%ebx
指向的内存中加载值并对其进行操作。实际上,括号的变体比您列出的要多。有关它们的说明(包括您询问的最后一个说明示例),请选中
希望有帮助。如果您还有任何问题,请随时发回。我想您的问题是,“寄存器名称周围的括号表示什么/do?”在较高级别上,括号表示从中的内存地址执行加载,并在指令中使用该值。即,鉴于
*command* %eax, %ebx
直接对%eax
和%ebx
寄存器中的值进行操作
*command* (%eax), (%ebx)
从%eax
和%ebx
指向的内存中加载值并对其进行操作。实际上,括号的变体比您列出的要多。有关它们的说明(包括您询问的最后一个说明示例),请选中
希望有帮助。如果您还有任何问题,请随时发回。我想您的问题是,“寄存器名称周围的括号表示什么/do?”在较高级别上,括号表示从中的内存地址执行加载,并在指令中使用该值。即,鉴于
*command* %eax, %ebx
直接对%eax
和%ebx
寄存器中的值进行操作
*command* (%eax), (%ebx)
从%eax
和%ebx
指向的内存中加载值并对其进行操作。实际上,括号的变体比您列出的要多。有关它们的说明(包括您询问的最后一个说明示例),请选中
希望有帮助。如果您还有任何问题,请随时发回。假设以下操作:
movl %eax, (%ebx) [1]
movl (%eax), %ebx [2]
movl (%eax, %ebx, 4), %ecx [3]
1,第一个将把eax
的值复制到存储在ebx
中的地址中,用C:
*(int *)ebx = eax; // copy eax into address
2,第二个将把存储在eax
地址中的值复制到ebx
:
ebx = *(int *)eax; // copy what in address into ebx
3,这是一个数组操作,ebx
是索引,4
是数组元素的大小
ecx = ((int *) p)[ebx];
计算如下:
ecx = *(int *)((char *)p + ebx * sizeof(int));
假设以下操作:
movl %eax, (%ebx) [1]
movl (%eax), %ebx [2]
movl (%eax, %ebx, 4), %ecx [3]
1,第一个将把eax
的值复制到存储在ebx
中的地址中,用C:
*(int *)ebx = eax; // copy eax into address
2,第二个将把存储在eax
地址中的值复制到ebx
:
ebx = *(int *)eax; // copy what in address into ebx
3,这是一个数组操作,ebx
是索引,4
是数组元素的大小
ecx = ((int *) p)[ebx];
计算如下:
ecx = *(int *)((char *)p + ebx * sizeof(int));
假设以下操作:
movl %eax, (%ebx) [1]
movl (%eax), %ebx [2]
movl (%eax, %ebx, 4), %ecx [3]
1,第一个将把eax
的值复制到存储在ebx
中的地址中,用C:
*(int *)ebx = eax; // copy eax into address
2,第二个将把存储在eax
地址中的值复制到ebx
:
ebx = *(int *)eax; // copy what in address into ebx
3,这是一个数组操作,ebx
是索引,4
是数组元素的大小
ecx = ((int *) p)[ebx];
计算如下:
ecx = *(int *)((char *)p + ebx * sizeof(int));
假设以下操作:
movl %eax, (%ebx) [1]
movl (%eax), %ebx [2]
movl (%eax, %ebx, 4), %ecx [3]
1,第一个将把eax
的值复制到存储在ebx
中的地址中,用C:
*(int *)ebx = eax; // copy eax into address
2,第二个将把存储在eax
地址中的值复制到ebx
:
ebx = *(int *)eax; // copy what in address into ebx
3,这是一个数组操作,ebx
是索引,4
是数组元素的大小
ecx = ((int *) p)[ebx];
计算如下:
ecx = *(int *)((char *)p + ebx * sizeof(int));
在AT&T asm语法中,括号表示“去引用”——与C中的一元
*
运算符大致相同。因此,一些粗略的等价:
movl %eax, %ebx eax = ebx
movl %eax, (%ebx) eax = *ebx
movl (%eax), %ebx *eax = ebx
这就是你的最后一个例子:
movl (%eax, %ebx, 4), %ecx
在这种情况下,有多个值组合在一起形成要取消引用的地址。大致相当于
*(eax + ebx*4) = ecx
在AT&T asm语法中,括号表示“去引用”——与C中的一元
*
运算符大致相同。因此,一些粗略的等价:
movl %eax, %ebx eax = ebx
movl %eax, (%ebx) eax = *ebx
movl (%eax), %ebx *eax = ebx
这就是你的最后一个例子:
movl (%eax, %ebx, 4), %ecx
在这种情况下,有多个值组合在一起形成要取消引用的地址。大致相当于
*(eax + ebx*4) = ecx
在AT&T asm语法中,括号表示“去引用”——与C中的一元
*
运算符大致相同。因此,一些粗略的等价:
movl %eax, %ebx eax = ebx
movl %eax, (%ebx) eax = *ebx
movl (%eax), %ebx *eax = ebx
这就是你的最后一个例子:
movl (%eax, %ebx, 4), %ecx
在这种情况下,有多个值组合在一起形成要取消引用的地址。大致相当于
*(eax + ebx*4) = ecx
在AT&T asm语法中,括号表示“去引用”——与C中的一元
*
运算符大致相同。因此,一些粗略的等价:
movl %eax, %ebx eax = ebx
movl %eax, (%ebx) eax = *ebx
movl (%eax), %ebx *eax = ebx
这就是你的最后一个例子:
movl (%eax, %ebx, 4), %ecx
在这种情况下,有多个值组合在一起形成要取消引用的地址。大致相当于
*(eax + ebx*4) = ecx