MOV инструкции и регистры - путаница! - PullRequest
10 голосов
/ 04 ноября 2010

Я читаю «Компьютерные системы: перспектива для программиста», в главе 3 объясняется mov инструкция, а объяснение, данное в книге, смущает меня.

дать функцию (стр. 142 1-е издание)

int exchange( int *xp, int y)
{
    int x = *xp;
    *xp = y;
    return x;
} 

Код сборки тела функции

movl 8(%ebp), %eax  //Get xp  
movl 12(%ebp), %edx //Get y  
movl (%eax), %ecx   //Get x at *xp  
movl %edx, (%eax)   //Store y at *xp  
movl %ecx, %eax     //Set x as return value

Что меня смущает, что будет храниться и где
Вот как я понимаю это:

movl 8(%ebp), %eax  //Get xp  

Процессор перемещается на + 8 байт вверх по стеку (от указателя кадра %ebp), принимает значение, сохраненное в этом месте, и сохраняет это значение в регистре %eax (для выделения - сохраняет значение, а не адрес)

Я прав? Спасибо!

Ответы [ 3 ]

14 голосов
/ 04 ноября 2010

Да, похоже, ты правильно понял.ИМХО, синтаксис AT & T 8(%ebp) менее интуитивен, чем Intel [ebp+8], что более понятно.Скобки показывают, что вы используете значение по адресу в регистре, а число - это смещение от того адреса, который вам действительно нужен.

3 голосов
/ 04 ноября 2010

Да, это использует синтаксис AT & T, который имеет вид:

instruction     source, dest

Сборка Intel в обратном порядке .

Вы также правы относительно того, что 8(%ebp) перемещается на 8 байт вверх от указателя кадра. В частности, причина, по которой он перемещается на 8 байт, заключается в том, что параметры помещаются в стек в обратном порядке («вправо» в «лево» при рассмотрении типичного вызова функции). Таким образом, сначала был нажат y, затем xp и, наконец, адрес возврата функции вызывающей стороны (именно поэтому вы перемещаете 8 байтов, а не 4).

1 голос
/ 04 ноября 2010

Вам необходимо понять, что такое стековый фрейм. Узнайте, что именно делают инструкции push и pop. До этого кода был

   push y_val
   push xp_ptr
   call exchange
.cont    
...
.exchange
   push ebp
   mov ebp, esp
// .. rest of code
// stack frame: 
   old_ebp_val  ; [ebp] points here
   .cont        ; [ebp + 4]
   xp_ptr       ; [ebp + 8]
   y_val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...