2017-03-06 92 views
0
struct big{ 
    struct small; 
} 
struct small{ 
    int a; 
    int b; 
} 

如果我在指針傳遞到大,並嘗試用如何訪問SPARC中結構中包含的結構中的元素?

ld [%i0], %l0 

訪問結構大,那麼如何訪問變量? 我可以使用

ld [%l0 + OFFSET], %l0 

要得到它嗎?看起來這會導致段錯誤。

+0

您不能訪問程序集中的任何一個結構體,只能訪問組成結構體的字節,半字和單詞。所以你需要弄清楚這些東西有多小,然後它們有多大。 –

+0

我不知道你用什麼彙編器。 struct small(裏面的大)不是一個指針。如果你解除引用l0,你就着陸了* a,我認爲這不是你想要的。不要像小指針那樣小引用 – Tommylee2k

+0

「big」真的只是向前定義了struct small的存在嗎,還是你忘記了在那裏放置成員變量名,比如'struct big {struct small s; }'?所以'大B; b.s.a = 1;'應該可以嗎?如果是這樣的話,那麼'big'和'small'結構實際上是相同的東西,如果你的代碼接收到指向big或者small的指針並不重要,它可以操作'a'和' b'以同樣的方式。 (除非你將虛函數添加到'big',那麼'.sa'和'.sb' * MAY *可以具有與'small'結構中的'.a'和'.b'不同的偏移量,沒有虛擬)。 – Ped7g

回答

1

當你傳入一個指向struct big的指針時,它指向的第一件事就是big.small.a,所以在第一條ld指令後,你已經獲得了big.small.a的值%10。如果您嘗試以指針的形式再次解除引用,那麼出現段錯誤並不奇怪。所以基本上我在說的是:

ld [%i0], %l0 /* gives big.small.a */ 
ld [%i0+4], %l0 /* gives big.small.b */