2012-05-15 59 views
1

我无法理解汇编中的绝对寻址和相对寻址的概念,特别是在gcc内联汇编中。我在教程中看到以下代码: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使用a *。除了用于绝对寻址之外,我无法找到星号的重要性的很好描述。我意识到绝对意味着实际物理地址,而相对意味着从程序开始时的偏移量。但是我不清楚相对寻址。我在汇编中阅读了有关PC的相对寻址,但我完全不了解它,并且我不清楚相对和PC相对是否相同。请解释一下。

回答

1

星号意味着什么。没有星号的指令是无效的。这是来自AT语法的伪像,基本上是“将ecx加载到指令译码器中”的等同于“跳转到ecx”的助记符。

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

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