我正在调试一些程序。在每指令调试(Eclipse CDT)中,我遇到过这个问题:
movabs %al,0xe400000000004049
rex.WB
执行movabs
指令后,调试将以SEGV终止。
我已经看过那些指令,其中第二个甚至看起来不像一个,呵呵。
可能不是由此造成的,但我最好问。
这是GNU汇编语法,因为我在Linux Gentoo 64bit上工作,我的CPU是Intel 2600K
(i7 second gen)。
答案 0 :(得分:6)
指令
movabs %al,0xe400000000004049
应该将al
的值存储在地址0xe400000000004049中。后一个地址无效,因为在当前的x86_64体系结构中,高17位(17位)地址必须全部为零或全部为1。
或者换句话说,当前的虚拟地址空间是48位符号扩展,即从0xffff 8000 0000 0000
到0x0000 7fff ffff ffff
。
这可能会在将来发生变化 - 但我们很可能会看到有几代人的cpus来去匆匆。
答案 1 :(得分:-2)
0xe400000000004049
可能有点大到可以投入。在x86(32位)AL(8位)是EAX的一部分(32位寄存器) 所以我假设(可能是错误的)在64位拱AL上是16位=>最大0xFF