2016-12-12 112 views
0
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) 

我无法理解IA32代码。我理解第一个movl指令表示%eax = q,第四个movl指令表示%eax = p,但我不明白第二,第三和第五条指令的意思。我认为第二条指令意味着q + B(char 1byte)= q + 40。对吗?这段代码是做什么来确定数组的大小?

回答

1

第二条和第三条指令的值为eax,其中包含值q

第二条指令获取q指向的内存位置的值加上40个字节。由于引用的struct成员的偏移量为40个字节,所以添加了位移。

第三条指令增加了另一个成员,基本上计算表达式v1+v2。再次,eax(包含值q)指向str2,位移12是被引用成员的该struct的偏移量。

第四指令加载eaxp和第五指令装载所计算的表达式,v1+v2,到了那里p加上96个字节,即p->y,分。

+0

所以Array'array'和's'的大小是40? –

+0

@FutureBillionaire'array'必须位于索引'0'(第一个成员的地址必须等于'struct'的地址)。接下来是't',然后''',然后'u',因为成员变量不能在'struct'中重新排序。由于't'在'struct'的'u'之前,它必须位于较低索引处,即'12'。 '你'在'40'。这意味着'sizeof(array)= 12 + padding'和'sizeof(s)= 40 - &s'。 (这只是伪代码,不会编译。) – Downvoter