C 这段代码是如何确定数组的大小的?
我无法理解IA32代码。我理解第一条movl指令表示%eax=q,第四条movl指令表示%eax=p,但我不理解第二条、第三条和第五条指令的含义。我认为第二条指令意味着q+B(char1byte)=q+40。是这样吗?第二条和第三条指令对C 这段代码是如何确定数组的大小的?,c,x86,structure,C,X86,Structure,我无法理解IA32代码。我理解第一条movl指令表示%eax=q,第四条movl指令表示%eax=p,但我不理解第二条、第三条和第五条指令的含义。我认为第二条指令意味着q+B(char1byte)=q+40。是这样吗?第二条和第三条指令对eax的值进行操作,该值包含q的值 第二条指令获取由q加40字节指向的内存位置的值。添加位移是因为引用的struct成员的偏移量为40字节 第三条指令添加另一个成员,基本上计算表达式v1+v2。同样,eax(包含q的值)指向str2,位移12是被引用构件的结构的
eax
的值进行操作,该值包含q
的值
第二条指令获取由q
加40字节指向的内存位置的值。添加位移是因为引用的struct
成员的偏移量为40字节
第三条指令添加另一个成员,基本上计算表达式v1+v2
。同样,eax
(包含q
的值)指向str2
,位移12
是被引用构件的结构的偏移量
第四条指令加载带有p
的eax
,第五条指令加载计算表达式v1+v2
,其中p
加上96个字节,即p->y
,点。因此,数组“Array”和“s”的大小为40?@future亿万富翁Array
必须位于索引0
(第一个成员的地址必须等于结构的地址).t
紧随其后,然后是s
,然后是u
,因为成员变量不能在struct
中重新排序。因为t
在struct
中位于u
之前,它必须位于较低的索引,即12
u
位于40
。这意味着sizeof(数组)=12+填充
和sizeof(s)=40-&s
(这只是伪代码,不会编译。)
typedef struct {
char array[B];
int t;
short s[B];
int u;
} str2;
typedef struct {
short x[A][B];
int y;
} str1;
void setVal{str1* p, str2 *q) {
int v1 = q->t;
int v2 = q->u;
p->y = v1+v2;
}
movl 12(%ebp), %eax
movl 40(%eax), %edx
addl 12(%eax), %edx
movl 8(%ebp), %eax
movl %edx, 96(%eax)