GAS无法识别寄存器%ip

时间:2012-10-10 23:58:13

标签: assembly gas att

在我的16位计划中,GAS正在遵循指令:

movw %ip, %dx

我觉得这很奇怪,因为移动段寄存器工作正常,例如:

movw %ss, %ax

完整的错误消息是:

  

错误:错误的注册名称'%ip'

我的版本字符串是:

  

GNU汇编程序(GNU Binutils)2.22

1 个答案:

答案 0 :(得分:5)

不幸的是,并非每个寄存器都可以轻松访问。有一些限制。

x86 wikibook, GPR section中所列,在x86中有8个通用寄存器(GPR):AX,CX,DX,BX,SP,BP,SI,DI,可用于许多命令。它们编码为3位;并且指令编码中没有空格来编码特殊寄存器,如EIP(IP)或EFLAGS(FLAGS)。

如果您向下滚动wikibook,则会有一个关于IP的部分:

  

指令指针

     

如果没有进行分支,EIP寄存器包含要执行的下一条指令的地址。

     

EIP只能在调用指令后通过堆栈读取。

因此,使用mov来读取IP是非法的。

有一些使用call然后pop %ax序列来阅读ip的示例:http://www.programmersheaven.com/mb/x86_asm/267963/267963/how-to-access-ip-register/

更新:关于SS寄存器的阅读:

实际上有许多mov指令编码的变体,例如,在这个table中,我们看到了段读数

 mnemonic   op1 op2 po     o    description, notes 
 MOV    Sreg    r/m16   8E     r        Move

或控制寄存器编写:

 MOV    r32 CRn 0F20   r ...    Move to Control Registers

但IP寄存器仍然没有MOV。

Update2:根据https://stackoverflow.com/a/1047968/196561

,在x86_64中有一个带有LEA的EIP读数