gcc内联汇编中的绝对和相对寻址

时间:2012-05-15 06:19:40

标签: assembly relative-addressing

我无法理解装配中绝对寻址和相对寻址的概念,特别是在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相对是否相同。请解释。

1 个答案:

答案 0 :(得分:1)

星号毫无意义。没有星号,指令无效。它是来自AT& T语法的伪像,基本上是“将ecx加载到指令解码器的解除引用值”的助记符,相当于“跳转到ecx”。

在Intel语法中,相同的指令是jmp ecx

寄存器中的偏移距离没有偏移跳转指令。 “PC”在x86上被称为ip(指令指针),“相对”没有任何进一步的上下文通常意味着“相对于ip”。