【问题标题】:Explanation for this assembly code此汇编代码的说明
【发布时间】:2011-06-02 05:13:13
【问题描述】:
void* curbrk;

__asm__ __volatile__(
    "mov .curbrk, %%rax;"
    "mov %%rax, %0"
        : "=r" (curbrk)
        :: "%rax"
);

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

【问题讨论】:

  • 事实上,没什么特别的。 .curbrk 不指代寄存器、标签或其他有意义的符号。
  • 那是什么?这也是我想不通的。

标签: c assembly


【解决方案1】:

它将符号.curbrk 的值复制到C 变量curbrk 中,可能在程序集或链接器脚本的某个地方定义,在此过程中破坏了RAX 寄存器。

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

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

但是请注意,在较新的 FreeBSD 中,brk()sbrk() 已被重新实现,不再依赖于 .curbrk,它是从 _end 初始化的,它应该来自可执行文件,但是混合 LLVM 的 ld 和 GNU ld 时很麻烦。所以brk()sbrk()现在使用内核来初始化它内部的curbrk,不再依赖_end。详情请见FreeBSD PR228754

【讨论】:

  • 是的,正是:) 我正在使用 FreeBSD。 [我也认为 .curbrk mite 是编译器定义的变量,可能指向 DS 的末尾,尝试用谷歌搜索它,但找不到任何信息。]。以及如何使用 brk(0) 访问数据段的末尾 - brk 不返回任何指针,也不会 brk(0) 将程序的数据段缩小到 0。
  • @Raj Kumar:哎呀,对不起,我的意思是sbrk(0)
  • @Raj:另外,DS 可能与此无关。 DS 和其他选择器可能设置为提供平坦的地址空间,并且通过分页强制执行限制,这在 *nix 中是传统的。
  • 是的,sbrk(0) 可以用来访问当前的系统中断。但我发布的代码实际上是我试图自己实现的 sbrk 的代码。 (因此,从 sbrk 调用 sbrk(0) 将毫无意义)。我一直在寻找其他方法来做到这一点。
  • 我假设当你说 它复制符号的值 .value 你的意思是 .curbrk?
【解决方案2】:

将值从.curbrk 标签或变量复制到%%rax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2017-05-15
    • 2021-09-24
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多