【问题标题】:SPARC assembly, How a C pointer to struct is accessedSPARC 程序集,如何访问指向结构的 C 指针
【发布时间】:2018-01-30 08:09:30
【问题描述】:

我有一小段 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;

为了完整起见,我上面展示的程序集 sn-p 是使用特定库函数映射的陷阱的代码:

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 结构指针是如何在汇编中“翻译”的。

提前感谢您的帮助,如果我写的东西不清楚,请原谅。

【问题讨论】:

    标签: c pointers assembly struct sparc


    【解决方案1】:

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

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

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

    这意味着ahbstat 是一个指向结构的指针。汇编中的标签ahbstat 因此成为该指针的地址。这使得%l3 成为结构地址的地址。

    我认为通过此更正,您可以弄清楚其余部分。

    【讨论】:

    • 我知道ahbstat 是一个指向结构的指针。相反,我不知道标签ahbstat 在汇编中会变成怎样。通过您的更正,我对总的 sn-p 有了清晰的认识。谢谢阿杰
    • @Andak:C 全局/静态变量名总是变成 asm 标签名,指向存储变量值的静态存储。
    猜你喜欢
    • 2017-01-04
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2020-07-17
    • 1970-01-01
    • 2017-04-02
    • 2014-06-09
    相关资源
    最近更新 更多