结构中指针的偏移量,以及如何在程序集中获取值
offset of a pointer in a struct, and how to get the value in assembly
假设有一个结构
struct info{
struct stat information;
char * filename
}
然后我设置文件名指针的偏移量
size_t fOffset = offsetof(struct info, filename);
现在 fOffset 是多少?
在 SPARC 程序集中,我想获取文件名中的实际字符串。这是我到目前为止写的。参数是info struct
的指针
set fOffset, %l0
ld [%l0], %l1
add %i0, %l1, %l2
ld [%l2], %l2
ldub [%l2], %o0
我以为现在 %o0 会存储字符串,但显然它不会。谁来帮帮我?
您正确地声明了fOffset,因此它会包含文件名在结构中的偏移量。我也认为你的程序集是正确的,虽然我不确定你所说的“%o2 将存储字符串”是什么意思。在代码的末尾,%l2 是指向字符串的指针,%o2 将包含字符串的第一个字节。所以你的代码在我看来是正确的。
关于可能出错的一些想法:
- 由于文件名是一个指针,您需要将其初始化为某些东西,可能使用 malloc。如果你不这样做,那么你可能会在 ldub 指令上出错,因为指针将无效
- 我猜你在代码中使用的是 32 位用户空间,但如果你是 运行 64 位用户空间,那么所有这些 "ld" 指令都需要 "ldx"
另请注意,您可以简化序列:
add %i0, %l1, %l2
ld [%l2], %l2
只有一条指令:
ld [%i0+%l1], %l2
假设有一个结构
struct info{
struct stat information;
char * filename
}
然后我设置文件名指针的偏移量
size_t fOffset = offsetof(struct info, filename);
现在 fOffset 是多少?
在 SPARC 程序集中,我想获取文件名中的实际字符串。这是我到目前为止写的。参数是info struct
的指针set fOffset, %l0
ld [%l0], %l1
add %i0, %l1, %l2
ld [%l2], %l2
ldub [%l2], %o0
我以为现在 %o0 会存储字符串,但显然它不会。谁来帮帮我?
您正确地声明了fOffset,因此它会包含文件名在结构中的偏移量。我也认为你的程序集是正确的,虽然我不确定你所说的“%o2 将存储字符串”是什么意思。在代码的末尾,%l2 是指向字符串的指针,%o2 将包含字符串的第一个字节。所以你的代码在我看来是正确的。
关于可能出错的一些想法:
- 由于文件名是一个指针,您需要将其初始化为某些东西,可能使用 malloc。如果你不这样做,那么你可能会在 ldub 指令上出错,因为指针将无效
- 我猜你在代码中使用的是 32 位用户空间,但如果你是 运行 64 位用户空间,那么所有这些 "ld" 指令都需要 "ldx"
另请注意,您可以简化序列:
add %i0, %l1, %l2
ld [%l2], %l2
只有一条指令:
ld [%i0+%l1], %l2