听起来这不太可能有用(与仅接受整个函数的地址,如void *tmp = main ),但这是可能的。
只需获取标签地址,或使用即可. (当前行的地址),并让链接程序担心将正确的立即数添加到机器代码中。 因此,您不必从体系结构上读取EIP ,而只是从即时读取当前值。
asm volatile("mov $., %0" : "=r"(address_of_mov_instruction) );
AT&T的语法是mov src, dst ,因此,如果汇编的话,您写的内容将是跳转。
(在架构上,EIP =一条指令在执行时的结尾 ,因此可以说您应该这样做
asm volatile(
"mov $1f, %0 \n\t" // reference label 1 forward
"1:" // GAS local label
"=r"(address_after_mov)
);
我正在使用asm volatile ,以防此asm语句通过内联或其他方式在同一函数内多次重复。 如果您希望每种情况获得不同的地址,则必须是volatile 。 否则,编译器可以假定此asm语句的所有实例都产生相同的输出。 通常情况下会没事的。
从体系结构上讲,在32位模式下,您没有针对LEA的RIP相对寻址,因此实际读取EIP的唯一好方法是调用/弹出。 它不是通用寄存器,因此您不能仅将其用作mov或任何其他指令的源或目的地。
但实际上您根本不需要内联汇编。 显示了如何使用&&label为其地址的GNU C扩展。
int