我无法理解装配中绝对寻址和相对寻址的概念,特别是在gcc内联汇编中。我在教程中看到了以下代码:
asm volatile(" \
cli; \
mov %0, %%ecx; \
mov %1, %%esp; \
mov %2, %%ebp; \
mov %3, %%cr3; \
mov $0x12345, %%eax; \
sti; \
jmp *%%ecx "
: : "r"(eip), "r"(esp), "r"(ebp), "r"(current_directory->physicalAddr));
这里最后一条指令jmp * %% ecx使用*。除了用于绝对寻址之外,我无法找到星号含义的良好描述。我认为绝对意味着实际的物理地址,而相对意味着偏离程序的开始。但是我不清楚相对寻址。我在汇编中读到了PC相对寻址,但我完全不理解它,我不清楚相对和PC相对是否相同。请解释。
答案 0 :(得分:1)
星号毫无意义。没有星号,指令无效。它是来自AT& T语法的伪像,基本上是“将ecx
加载到指令解码器的解除引用值”的助记符,相当于“跳转到ecx”。
在Intel语法中,相同的指令是jmp ecx
。
寄存器中的偏移距离没有偏移跳转指令。 “PC”在x86上被称为ip
(指令指针),“相对”没有任何进一步的上下文通常意味着“相对于ip
”。