这条指令错了吗? (movabs%al,0xe400000000004049)

时间:2012-03-28 16:34:47

标签: c++ debugging assembly

我正在调试一些程序。在每指令调试(Eclipse CDT)中,我遇到过这个问题:

movabs %al,0xe400000000004049
rex.WB

执行movabs指令后,调试将以SEGV终止。 我已经看过那些指令,其中第二个甚至看起来不像一个,呵呵。

可能不是由此造成的,但我最好问。

这是GNU汇编语法,因为我在Linux Gentoo 64bit上工作,我的CPU是Intel 2600K(i7 second gen)。

2 个答案:

答案 0 :(得分:6)

指令

movabs %al,0xe400000000004049

应该将al的值存储在地址0xe400000000004049中。后一个地址无效,因为在当前的x86_64体系结构中,高17位(17位)地址必须全部为零或全部为1。 或者换句话说,当前的虚拟地址空间是48位符号扩展,即从0xffff 8000 0000 00000x0000 7fff ffff ffff

这可能会在将来发生变化 - 但我们很可能会看到有几代人的cpus来去匆匆。

答案 1 :(得分:-2)

0xe400000000004049

可能有点大到可以投入。在x86(32位)AL(8位)是EAX的一部分(32位寄存器) 所以我假设(可能是错误的)在64位拱AL上是16位=>最大0xFF