Pointers 命令中的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寄存器中

我是x86新手

我知道这种带指针的东西意味着什么

*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