C 此汇编代码的说明
有人能解释一下这个简单的汇编代码是做什么的吗?谢谢。它将可能在程序集或链接器脚本的某个位置定义的符号C 此汇编代码的说明,c,assembly,C,Assembly,有人能解释一下这个简单的汇编代码是做什么的吗?谢谢。它将可能在程序集或链接器脚本的某个位置定义的符号.curbrk的值复制到C变量curbrk,并在过程中关闭RAX寄存器 .curbrk可能指向数据段的当前结尾。Glibc似乎定义了一个类似的符号\uuu-curbrk,您可能正在使用其他libc(BSD?)。在任何情况下,sbrk(0)都将是访问该值的更方便的方式 在查看FreeBSD交叉引用之后,我可以说它确实指向了数据段的当前端:它在和中都使用,使用宏来前置一个,并且它显示为on(在当前Fr
.curbrk
的值复制到C变量curbrk
,并在过程中关闭RAX
寄存器
.curbrk
可能指向数据段的当前结尾。Glibc似乎定义了一个类似的符号\uuu-curbrk
,您可能正在使用其他libc(BSD?)。在任何情况下,sbrk(0)
都将是访问该值的更方便的方式
在查看FreeBSD交叉引用之后,我可以说它确实指向了数据段的当前端:它在和中都使用,使用宏来前置一个
,并且它显示为on(在当前FreeBSD上不再为true)
但是,请注意,在较新的FreeBSD中,
brk()
和sbrk()
已被重新实现,不再依赖于.corbrk
,它是从\u end
初始化的,它本应来自可执行文件,但在混合LLVM的ld和GNU ld时出现了问题。因此brk()
和sbrk()
现在使用内核初始化其内部curbrk
,不再依赖\u end
。有关详细信息,请参见。将值从复制到%%rax
中。按原样将标签或变量复制到%%rax中,无需特别说明.curbrk
不是指寄存器、标签或其他有意义的符号。那么它是什么呢?这也是我无法理解的。是的,没错:)我在用FreeBSD。[我也这么想。corbrk mite可能是一个编译器定义的变量,可能指向DS的末尾,尝试用谷歌搜索,但找不到任何信息。]。我如何使用brk(0)访问数据段的结尾-brk不会返回任何指针,也不会将程序的数据段brk(0)收缩为0。@Raj Kumar:oops,对不起,我的意思是sbrk(0)
@Raj:另外,DS可能根本与此无关。DS和其他选择器可能被设置为提供一个平坦的地址空间,并且限制是通过分页实现的,这在*nix中是传统的。是的,sbrk(0)可以用来访问当前的系统中断。但我发布的代码实际上是我试图自己实现的sbrk代码。(因此,从sbrk调用sbrk(0)将毫无意义)。我正在寻找其他方法来实现这一点。我想当你说它复制符号的值.value
,你的意思是.curbrk
?
void* curbrk;
__asm__ __volatile__(
"mov .curbrk, %%rax;"
"mov %%rax, %0"
: "=r" (curbrk)
:: "%rax"
);