结构中指针的偏移量,以及如何在程序集中获取值

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