2012-05-15 2 views
1

Я не могу понять концепцию абсолютной адресации и относительной адресации в сборке, особенно в сборке gcc inline. В учебнике я видел следующий код:абсолютная и относительная адресация в сборке gcc inline

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

Звездочка ничего не значит. Инструкция не указана без звездочки. Это артефакт из синтаксиса AT & T, в основном мнемоника для «разыменованного значения нагрузки ecx в декодер команд», что эквивалентно «переходу на ecx».

В синтаксисе Intel такая же инструкция будет jmp ecx.

Нет инструкции по смещению с смещением в регистре. «ПК» называется ip (указатель инструкции) на x86, «относительный» без какого-либо дополнительного контекста обычно означает «относительно ip».

Смежные вопросы