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

时间:2018-01-30 08:09:30

标签: c pointers assembly struct sparc

我有一小段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结构指针是如何"翻译"在集会中。

在此先感谢您的帮助,如果我写的内容不明确,请原谅。

1 个答案:

答案 0 :(得分:3)

除了ahbstat之外,你几乎已经理解了所有内容。

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

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

这意味着ahbstat是指向结构的指针。程序集中的标签ahbstat因此成为该指针的地址。这使%l3成为结构地址的地址。

我认为通过这种修正,你可以弄清楚其余部分。