Assembly 将指令指针的当前值复制到另一个寄存器中

Assembly 将指令指针的当前值复制到另一个寄存器中,assembly,x86-64,cpu-architecture,Assembly,X86 64,Cpu Architecture,为什么可以这样做: mov %rbx, %rcx 但不要这样做: mov %rip, %rax # lea (%rip), %rax 为什么会出现这种情况,以及call如何计算返回地址?因为rip不是通用寄存器,没有编码。然而,lea是合法有效的call基本上使用rip作为返回地址,因为它已经指向x86体系结构中的当前指令。@Jester ok,那么call func基本上是这样做的:sub$8,%rsplea%rip,%rax移动%rax,(%rsp)jmp func(忽略指令本身会改变返

为什么可以这样做:

mov %rbx, %rcx
但不要这样做:

mov %rip, %rax
# lea (%rip), %rax

为什么会出现这种情况,以及
call
如何计算返回地址?

因为
rip
不是通用寄存器,没有编码。然而,
lea
是合法有效的
call
基本上使用
rip
作为返回地址,因为它已经指向x86体系结构中的当前指令。@Jester ok,那么
call func
基本上是这样做的:
sub$8,%rsp
<代码>lea%rip,%rax<代码>移动%rax,(%rsp)
jmp func
(忽略指令本身会改变返回地址)?“内部”指令的工作方式不限于ISA提供给机器的操作code@harold谢谢,你能解释一下吗?我对组装很陌生。是的,它基本上就是这样工作的。您还需要忽略
rax
和被覆盖的标志。因为
rip
不是通用寄存器,没有编码。然而,
lea
是合法有效的
call
基本上使用
rip
作为返回地址,因为它已经指向x86体系结构中的当前指令。@Jester ok,那么
call func
基本上是这样做的:
sub$8,%rsp
<代码>lea%rip,%rax<代码>移动%rax,(%rsp)
jmp func
(忽略指令本身会改变返回地址)?“内部”指令的工作方式不限于ISA提供给机器的操作code@harold谢谢,你能解释一下吗?我对组装很陌生。是的,它基本上就是这样工作的。您还需要忽略
rax
和被覆盖的标志。