1

我无法理解汇编中绝对寻址和相对寻址的概念,尤其是在 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 相对是否相同。请解释一下。

4

1 回答 1

1

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

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

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

于 2012-05-15T08:43:56.053 回答