2016-12-12 69 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