2017-03-06 75 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 */