Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Linux/Unix > адресация


Автор: MAKCim 22.11.2006, 10:30
проясните ситуацию
есть простой код
Код

int main() {
    int a = 5,
         *b = &a;

    *b = 6;

    return 0;
}

и его asm представление
Код

.file    "a.c"
    .text
.globl main
    .type    main, @function
main:
...
    movl    $5, -12(%ebp)
    leal    -12(%ebp), %eax
    movl    %eax, -8(%ebp)
    movl    -8(%ebp), %eax
    movl    $6, (%eax)
...
    ret
    .size    main, .-main
    .ident    "GCC: (GNU) 4.1.0"
    .section    .note.GNU-stack,"",@progbits

что за адрес записывается в %eax в инструкции?
Код

leal    -12(%ebp), %eax

вроде как эффективный, т. е смещение внутри стека
но если так, каким тогда образом отрабатывает инструкция?
Код

movl    $6, (%eax)

если в %eax смещение, то какой тогда сегментный регистр используется для идентификации дескриптора в LDT?
т. к программа естественно работает, получается что %ss, что не логично потому как если изменить программу таким образом
Код

int a = 5;
int main() {
    int* b = &a;

    *b = 6;

    return 0;
}

то меняются лишь 2 строчки
вместо
Код

leal    -12(%ebp), %eax
movl    %eax, -8(%ebp)

Код

movl    $a,  -8(%ebp)

и получаем все то же косвенное обращение через %eax но в данном случае уже к переменной в сегменте данных
отсюда делаем вывод, что в leal в первом варианте и в movl во втором берется не смещение, а линейный адрес (база в соответствующем дескрипторе + смещение). Мои рассуждения верны?

Автор: MAKCim 22.11.2006, 23:17
никто не знает?

Автор: dumb 23.11.2006, 14:50
тонкости уже выпали из головы, но одно можно сказать точно: 
Цитата(MAKCim @  22.11.2006,  10:30 Найти цитируемый пост)
линейный адрес (база в соответствующем дескрипторе + смещение)

никого не интересует, и, мало того, в eax просто не влезет smile

Автор: MAKCim 23.11.2006, 15:50
Цитата

в eax просто не влезет

что значит не влезет? 32-ую адресацию никто не отменял

Автор: MAKCim 23.11.2006, 16:34
по совету SergeCpp посмотрел через gdb регистры, никакого линейного адреса и не видно
т. е в
Код

leal -12(%%ebp), %%eax

берется значение EBP-12, т. е смещение
ничего не понимаю  smile 

ps. вопрос принципиальный

Автор: SergeCpp 23.11.2006, 17:45
user posted image
http://www-128.ibm.com/developerworks/linux/library/l-memmod/

Автор: MAKCim 23.11.2006, 18:23
спасибо все за участие, вопрос решен

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)