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

时间:2011-06-10 07:04:09

标签: x86 disassembly

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

有谁知道?

BTW,read如何知道他到了文件的末尾?

3 个答案:

答案 0 :(得分:2)

不,这是一个直接的价值。 pushq将一个值推送到堆栈,可能是一个寄存器,但你会发现它们被%rbx等操作数表示。

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尚未提及,但领先的$符号表示常量。在查看汇编转储时很简单。

一个简单的陷阱:当查看未链接的二进制文件的转储时,不要被遍布的0x00000000所欺骗。如果没有前导$,那些是链接器重定位,而不是常量0值。