$0x1a 是这里的寄存器吗?

发布于 2024-11-14 13:25:27 字数 361 浏览 3 评论 0原文

Dump of assembler code for function read@plt:
0x0000000000402458 <read@plt+0>:    jmpq   *0x2b4f72(%rip)        # 0x6b73d0 <_GLOBAL_OFFSET_TABLE_+232>
0x000000000040245e <read@plt+6>:    pushq  $0x1a
0x0000000000402463 <read@plt+11>:   jmpq   0x4022a8

有人知道吗?

顺便说一句,read 如何知道他到达了文件末尾?

Dump of assembler code for function read@plt:
0x0000000000402458 <read@plt+0>:    jmpq   *0x2b4f72(%rip)        # 0x6b73d0 <_GLOBAL_OFFSET_TABLE_+232>
0x000000000040245e <read@plt+6>:    pushq  $0x1a
0x0000000000402463 <read@plt+11>:   jmpq   0x4022a8

Anyone knows?

BTW,how does read knows he comes to the end of file?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

偏爱自由 2024-11-21 13:25:27

不,这是一个立即值。 pushq 将一个值压入堆栈,该堆栈可能是一个寄存器,但您会发现它们由诸如 %rbx 之类的操作数表示。

$0x1a 是一个立即值 - 您也可以通过该指令的长度(五个字节,从 x+6x+10代码>)。 pushq 指令能够推送寄存器、内存内容(64 位)或 32 位立即值(符号扩展为 64 位)。

在本例中,五个字节是操作码 0x68 以及要推送的 32 位值。如果您要检查内存,它可能看起来像 0x68 0x1a 0x00 0x00 0x00

不要被该代码所迷惑,它根本不是“真正的”read 调用。它是一个存根,用于在运行时修复引用,其中代码部分可以在处理器之间共享,即使在不同的基地址上也是如此。

PLT 是一个占用空间很小的每进程存根,它第一次跳转到真正的共享代码,并在进程中修复自己,以便将来直接跳转到那里。有关此过程的说明,请参阅此处

No, it's a immediate value. pushq pushes a value onto the stack, which may be a register, but you'll find they're denoted by operands like %rbx.

The $0x1a is an immediate value - you can tell this also by the length of that instruction (five bytes, from x+6 to x+10). The pushq instruction is capable of pushing a register, a memory content (64 bits) or a 32-bit immediate value (sign extended to 64 bits).

In this case, the five bytes are the opcode 0x68 along with the 32-bit value to push. If you were to examine the memory, it would probably look like 0x68 0x1a 0x00 0x00 0x00.

And don't be fooled by that code, it's not the "real" read call at all. It's a stub used to fix up references at runtime where code sections may be shared amongst processors, even at different base addresses.

The PLT is a small-footprint per-process stub which jumps to the real shared code the first time, fixing itself up in the process, so as to jump directly there in future. See here for an explanation of this process.

醉梦枕江山 2024-11-21 13:25:27

寄存器(通常)没有存储位置,它们是 CPU 寄存器。

Registers do not (ordinarily) have a memory location, they are a CPU register.

北斗星光 2024-11-21 13:25:27

尚未提及,但前导 $ 符号表示常量。就像查看程序集转储时一样简单。

一个简单的陷阱:在查看未链接的二进制文件的转储时,不要被到处都是 0x00000000 所愚弄。如果没有前导 $,这些是链接器重定位,而不是常量 0 值。

Not mentioned yet, but the leading $ sign denotes a constant. Simple as that when looking at assembly dumps.

One easy pitfall: when looking a dumps of unlinked binaries, don't be fooled by 0x00000000 all over the place. Without the leading $, those are linker relocations, not constant 0 values.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文