Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在SPARC assmebly中访问包含在结构中的结构中的元素?_Assembly_Sparc - Fatal编程技术网

Assembly 如何在SPARC assmebly中访问包含在结构中的结构中的元素?

Assembly 如何在SPARC assmebly中访问包含在结构中的结构中的元素?,assembly,sparc,Assembly,Sparc,如果我将指针传递到big,并尝试使用 struct big{ struct small; } struct small{ int a; int b; } 要访问结构big,那么如何访问变量a? 我能用吗 ld [%i0], %l0 要得到它吗?这似乎导致了一个segfault。当您传入指向struct big的指针时,它指向的第一个对象将是big.small.a,因此在第一条ld指令之后,您已经在%l0中获得了big.small.a的值。如果您尝试将其作为指针再次取消

如果我将指针传递到big,并尝试使用

struct big{
    struct small;
}
struct small{
    int a;
    int b;
}
要访问结构big,那么如何访问变量a? 我能用吗

ld [%i0], %l0

要得到它吗?这似乎导致了一个segfault。

当您传入指向struct big的指针时,它指向的第一个对象将是big.small.a,因此在第一条ld指令之后,您已经在%l0中获得了big.small.a的值。如果您尝试将其作为指针再次取消引用,那么得到segfault也就不足为奇了。所以基本上我想说的是:

ld [%l0 + OFFSET], %l0

您不能访问汇编中的任何一个结构,只能访问构成该结构的字节、半字和字。所以你需要弄清楚它们有多小,然后它们有多大。我不知道你用的是什么汇编程序。大的内部的struct small不是指针。如果你取消l0的引用,你会在*a上着陆,我想这不是你想要的。不要像指针一样取消对small的引用,它实际上只是向前定义struct small的存在,或者您是否忘记在那里输入成员变量名,比如struct big{struct small s;}?这么大的b,;b、 s.a=1;可能吗?如果是这样的话,那么大结构和小结构实际上是一样的,不管你的代码是接收到指向大还是指向小的指针,它都可以用同样的方式操作a和b。除非您将虚函数添加到big,否则.s.a和.s.b可能与小结构中的.a和.b有不同的偏移量,如果小结构没有虚函数。我的意思是,这些东西是特定于编译器/实现的,默认情况下C结构不是二进制可移植的。有一些技术如何以二进制可复制的方式定义C结构,将填充设置为零,仅使用POD类型,不使用虚拟函数,通过仅使用字节/字符串或通过定义较大类型的字节顺序等来解析endianness…,例如,当某些软件需要打开存储在不同平台上的文件时使用。但是,如果您只编写普通的C结构,并且没有更多的变量和类型,那么它将在不同的平台/编译器上进行不同的编译。
ld [%i0], %l0    /* gives big.small.a */
ld [%i0+4], %l0  /* gives big.small.b */