SPARC 程序集,如何访问指向结构的 C 指针

SPARC assembly, How a C pointer to struct is accessed

我试图理解一小段 SPARC 汇编代码。

 .section ".text"
 .global tt_0x09
tt_0x09:
 /* Find AHBSTAT */
 set ahbstat, %l3
 ld [%l3], %l3
 /* Get failing address from AHBSTAT faddr. */
 ld [%l3 + 4], %l4

 set 0xDEADBEEF, %l5
 st %l5, [%l4]

 /*st %g0, [%l3]*/
 /* Re-execute trapped instruction. */
 jmp %l1
 rett %l2 

其中 ahbstat 在 C 文件中定义

#define AHBSTAT_REGS 0x80000f00
struct ahbstat_regs { unsigned int status, faddr; };
...
volatile struct ahbstat_regs *ahbstat = (void *) AHBSTAT_REGS;

为了完整起见,我上面显示的汇编片段是使用特定库函数映射的陷阱代码:

extern void tt_0x09(void); static const int TT_DATA_ACCESS_EXCEPTION = 0x09; ... bcc_set_trap(TT_DATA_ACCESS_EXCEPTION, tt_0x09);

我不明白的一点是如何在汇编代码中访问结构。事实上,如果 l3 包含结构的地址,然后使用 ld [%l3], %l3 我从内存中加载一个词到 l3 它自己,所以我复制了unsigned int status 的结构变成 l3.

另一个问题是在连续的行中:它将l5设置为0xDEADBEEF,然后将l5存储在指向l4的内存位置。但是 l4 已经加载了内存位置 [%l3+4] 的值,据我所知这是无意义的,因为 l3 包含结构的 unsigned int status 的值。

程序应该在失败地址指向的内存位置写入0xdeadbeef,这是结构的faddr中包含的地址。

我哪里错了,但我想我对 load 指令很清楚: ld [addr], rd -> 从 addr 加载一个词到 rd.

所以我认为我不清楚汇编中的 C 结构指针是如何 "translated"。

在此先感谢您的帮助,如果我写的不清楚,请原谅。

除了 ahbstat 是什么,您几乎已经正确理解了所有内容。

在 C 代码中,您可以看到声明 -

volatile struct ahbstat_regs *ahbstat = (void *) AHBSTAT_REGS;

这意味着 ahbstat 是指向结构的指针。汇编中的标号ahbstat就成了这个指针的地址。这使得 %l3 成为结构地址的地址。

我想有了这个更正,你就可以解决剩下的问题了。