Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 此汇编代码的说明_C_Assembly - Fatal编程技术网

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"
);