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
成为结构地址的地址。
我想有了这个更正,你就可以解决剩下的问题了。
我试图理解一小段 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
成为结构地址的地址。
我想有了这个更正,你就可以解决剩下的问题了。