在我的16位计划中,GAS正在遵循指令:
movw %ip, %dx
我觉得这很奇怪,因为移动段寄存器工作正常,例如:
movw %ss, %ax
完整的错误消息是:
错误:错误的注册名称'%ip'
我的版本字符串是:
GNU汇编程序(GNU Binutils)2.22
答案 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。
,在x86_64中有一个带有LEA的EIP读数