2011-06-10 62 views

回答

2

不,这是立竿见影的价值。 pushq将值推入堆栈,其中可能是是一个寄存器,但是您会发现它们由操作数表示,如%rbx

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

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

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

PLT是一个小尺寸的进程存根,它首次跳转到真正的共享代码,在进程中自行修复,以便在将来直接跳转到那里。有关此过程的解释,请参阅here

+0

所以'$ 0x1a'确实是一个寄存器,'%rbx'具体是? – cpuer 2011-06-10 07:11:52

+1

不,$ 0x1a不是寄存器,它是Windows及其前辈的十六进制'1a'(十进制数26)文件结束指示符的立即值。 – paxdiablo 2011-06-10 07:13:27

+0

所以我可以想象还有其他类似的调用是否最终进入相同的系统调用,但使用与$ 0x1a不同的参数? – cpuer 2011-06-10 07:18:37

0

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

+0

当我们说注册时,除CPU注册之外,我们永远不会意味着什么,对吧? – cpuer 2011-06-10 07:27:39

+0

不,根据上下文,“寄存器”可能意味着其他事情,但如果上下文是低级汇编,那么是的,它几乎总是一个CPU寄存器。 – Arafangion 2011-06-10 07:53:15

0

尚未提及,但前导$符号表示常数。查看装配转储时很简单。

一个简单的错误:当查看未链接的二进制文件的转储时,不要被0x00000000遍布整个地方。没有前导$,那些是链接器重定位,而不是常量0值。