2013-02-15 2 views
1

позволяет сказать, что у меня есть следующие сборочные линииПонимание ATT Ассамблеи (немедленная)

movl $-1, %edi 
movl $1, %edx 

Что именно я хранящая в% едите /% EDX регистры.

В принципе, если бы я должен был преобразовать этот код в программу на C, я бы инициализировал некоторые переменные в -1 и 1, потому что это то, как я это вижу, и именно там я думаю, что меня путают.

Я понимаю, что немедленно = «какая-то константа», но что это значит?

+3

Похоже, вы уже правильно это поняли. Immediate - постоянная встроенная в код. Здесь у нас есть две константы, -1 и 1. –

+6

Обратите внимание, что это не то же самое, обязательно, как инициализация переменной в 'C'. Фактически вы загружаете значение в регистр. – RageD

+2

Непосредственная константа, как вы говорите. Он называется немедленным, потому что он закодирован в фактическую инструкцию (а не из памяти). – slugonamission

ответ

3

Есть четыре способа загрузки что-то в регистр:

  1. Немедленное значение - в AT & T ассемблере, который с помощью $number, и он загружает эту особую ценность (количество) в регистр. Обратите внимание, что number не обязательно должно быть числовым значением, оно может быть, например, movl $printf, %eax - это будет загружать адрес функции printf в регистр eax.

  2. Из другого регистра, movl %eax, %edx - теперь у нас есть eax значение, скопированное в edx.

  3. Из фиксированной памяти, movl myvar, %eax - содержимое myvar находится в eax.

  4. Из ячейки памяти в другом регистре, movl (%eax), %edx - теперь, edx имеет все 32-битное значение по адресу в eax. Конечно, если предположить, что это действительно «хорошая» ячейка памяти, а если нет, у нас есть segfault.

Если это код С, код может loook немного как это:

1)

int x = 42; 

int (*printfunc)(const char *fmt, ...) = printf; 

2)

int x = 1; 
int y = 2; 
..., 
x = y;  // movl %eax, %edx 

3)

int x = myvar; 

4)

int x = *myptr; 

Edit: Почти все, что является «источником» для инструкции перемещения также может быть источником для арифметических операций, таких как add $3, %eax будет эквивалент в С x += 3;.

+0

Просто, чтобы промежуточное значение можно было использовать и в других контекстах, например, при добавлении или другой операции. – vonbrand

+0

Удивительный. Хорошо и много спасибо. – juice

+0

Вы также можете использовать 'lea' для загрузки немедленного значения или значения из другого регистра (оба должны быть представлены как адрес памяти) в регистр: 1)' lea eax, number' 2) 'lea edx, [eax] '3) & 4) не могут выполнять операции с' lea'. – nrz