我有一小段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结构指针是如何"翻译"在集会中。
在此先感谢您的帮助,如果我写的内容不明确,请原谅。
答案 0 :(得分:3)
除了ahbstat
之外,你几乎已经理解了所有内容。
在C代码中,您可以看到声明 -
volatile struct ahbstat_regs *ahbstat = (void *) AHBSTAT_REGS;
这意味着ahbstat
是指向结构的指针。程序集中的标签ahbstat
因此成为该指针的地址。这使%l3
成为结构地址的地址。
我认为通过这种修正,你可以弄清楚其余部分。