Assembly x86汇编指令mov[esp&x2B;0ACh&x2B;var_A4],eax

Assembly x86汇编指令mov[esp&x2B;0ACh&x2B;var_A4],eax,assembly,x86,Assembly,X86,我遇到了以下x86汇编指令 mov [esp+0ACh+var_A4], eax 我不能理解它。正如我所猜测的,它正在将eax寄存器中的值保存到esp+0ACh+var_A4表示的地址中。不确定。 我能够理解以下装配说明。很明显, mov eax, [ebp+0] 正在将ebp+0加载到eax寄存器中。如果我错了,请纠正。请注意,您有这样的问题: typedef struct my_Struct { u_int8 x; u_int8 y; u_int16

我遇到了以下x86汇编指令

mov     [esp+0ACh+var_A4], eax
我不能理解它。正如我所猜测的,它正在将
eax
寄存器中的值保存到
esp+0ACh+var_A4
表示的地址中。不确定。 我能够理解以下装配说明。很明显,

mov     eax, [ebp+0]

正在将
ebp+0
加载到
eax
寄存器中。如果我错了,请纠正。

请注意,您有这样的问题:

typedef struct my_Struct {
   u_int8  x;
   u_int8  y;
   u_int16 z;
   u_int32 a4;
}

#define offs_x 0
#define offs_y 1
#define offs_z 2
#define offs_a4 4

myStruct myArray[SIZE];
您想访问myArray[21].a4

在汇编程序中,并没有结构,也并没有数组。您必须自己计算myArray[21].a4的位置。阵列只是一个内存块:

0000: myArray[0].x
0001: myArray[0].y
0002: myArray[0].z #1
0003: myArray[0].z #2
0004: myArray[0].a4 #1
0005: myArray[0].a4 #2
0006: myArray[0].a4 #3
0007: myArray[0].a4 #4
0008: myArray[1].x
0009: myArray[1].y
...
假设EBP指向myArray

每个元素的长度为8字节(1+1+2+4字节),因此myArray[21]位于EBP+21*sizeof(my_Struct)=EBP+172(=EBP+ACh),myArray[21]位于EBP+ACh+offs_a4

最后:要读取myArray[21].a4,您必须

mov eax, [EBP + ACh + offs_a4]

这也适用于已调用函数中的ESP(ESP表示您正在处理局部变量,这通常是堆栈上保留的内存),0ACh是此变量的偏移量,

mov eax,[ebp+0]
移动4个字节(因为确定是32位寄存器)在EBP指向的地址,并将其存储在EAX中。@MichaelPetch ya但您如何
mov[esp+0ACh+var_A4],EAX
将此指令放入其中?@SushantelpalPale:它与
[EBP+0]
并没有什么不同(从汇编程序和链接程序的角度来看,有一些差异,但您不必担心)。在一种情况下,偏移量为
0
,而在另一种情况下,偏移量为
var_A4+0ACh
0ACh
var_A4
都是加在一起的偏移量。反汇编程序已将其分解,以识别它出现的数据结构。因此,
mov[esp+0ACh+var_A4],eax
.var+A4将是该变量的偏移值。它将EAX中的4个字节移动到C中esp+0ACh+var_A4所指向的内存地址,您甚至不必定义偏移量,可以使用。不管怎么说,这些#定义不是你在C语言中做过的事情,所以你应该给它们添加注释。你是对的。我只是定义了它们,以显示第二个偏移量的来源。他们没有伤害:)