此汇编代码的说明

Raj*_*Raj 3 c assembly

void* curbrk;

__asm__ __volatile__(
    "mov .curbrk, %%rax;"
    "mov %%rax, %0"
        : "=r" (curbrk)
        :: "%rax"
);
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这个简单的汇编代码是做什么的?谢谢。

nin*_*alj 5

它将.curbrk可能在汇编或链接描述文件的某处定义的符号的值复制到 C 变量中curbrk,从而RAX在该过程中破坏寄存器。

.curbrk可能指向数据段的当前结尾。Glibc 似乎定义了一个类似的符号__curbrk,您可能正在使用其他一些 libc(BSD?)。无论如何,sbrk(0)这将是一种更便携的访问该值的方式。

查看 FreeBSD交叉引用后,我可以说它确实指向数据段的当前结尾:它在brk()和 中都使用sbrk(),使用HIDENAME宏在前面加上一个.,它出现在amd64 的 System.map 上(不再适用于当前的 FreeBSD)。

但是请注意,在较新的 FreeBSD 中,brk()并且sbrk()已经重新实现不再依赖于.curbrk,它是从 初始化的_end,它应该来自可执行文件,但是在混合 LLVM 的 ld 和 GNU ld 时会出现问题。因此,brk()sbrk()现在使用的内核初始化其内部curbrk,而不再依赖_end。有关详细信息,请参阅FreeBSD PR228754