【发布时间】: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