2015-04-19 1 views
3

Я изучаю сборку x86 в классе, и я очень потерял то, как вы различаете, что такое операнд регистров и что делает ссылка на память. У меня было несколько путаниц, которые я надеялся прояснить.x86 mov/add Инструкции и память Адресация

Следующий код является то, что мой учебник говорит, это длинный путь, чтобы сделать толчок и поп соответственно:

subl $4, %esp 
movl %ebp, (%esp) 

movl (%esp), %eax 
addl $4, %esp 

Так в инструкции subl, мы можем всегда рассчитывать% особ удерживать значение адреса?

Также в чем разница между двумя функциями movl? Может ли первый быть указан как

movl (%ebp), %esp 

? А для второго movl это перемещает адрес% esp или перемещает значение, на которое указывает% esp?

В качестве продолжения, почему мы не можем иметь источник и место назначения как ссылки на память?

movw (%eax), 4(%esp) 

И, наконец, для следующего кода:

movb (%esp, %edx, 4), %dh 

если источник является более чем 1 байт (размер% йк), то, что происходит? Это просто усекает значение?

Извините, это была тонна вопросов, но любая помощь была бы принята с благодарностью.

ответ

2

Следующий код является то, что мой учебник говорит, это длинный путь, чтобы сделать толчок и поп соответственно:

subl $4, %esp 
movl %ebp, (%esp) 

movl (%esp), %eax 
addl $4, %esp 

Так в инструкции subl, мы можем всегда рассчитывать% особ провести адрес стоимость?

Да. В регистре ESP хранится адрес памяти последнего значения, введенного в стек.

Также в чем разница между двумя функциями movl? Может ли первым написать в виде

movl (%ebp), %esp 

? А для второго movl, перемещает ли адрес% esp или делает , он перемещает значение, на которое указывает% esp?

MOV инструкция, в AT&T синтаксисе, ожидает два операнда: источник и назначение. MOV копирует данные (в этом случае 32 бита, обозначенные суффиксом L) из первого операнда, написанного слева, ко второму операнду, написанному справа. Если один из них заключен в скобки, что означает, что операнд является операндом памяти, а значение в скобках его адрес в памяти, а не фактическое значение)

Итак, movl %ebp,(%esp) означает: скопировать значение регистра EBP в память, по адресу, указанному значением регистра ESP.

Что вы имели в виду с movl (%ebp),%esp: копировать 32 бита данных, начиная с адреса памяти, указанного значением EBP, в регистр ESP.

Таким образом, вы меняете направление движения.

В дальнейшем, почему у нас нет источника и адресата таких ссылок на память?

movw (%eax), 4(%esp) 

Короткий ответ: потому, что кодирование используется Intel не позволит. Длинный ответ: путь Intel разработала ISA, имеющиеся ресурсы для расчета двух эффективных адресов в старом добром 8086, и т.д.

И, наконец, для следующего кода:

movb (%esp, %edx, 4), %dh 

если источник более чем 1 байт (размер% dh), то что происходит ? Это просто усекает значение?

Источник такого же размера, что и пункт назначения. Это накладывается как суффиксом B, так и тем фактом, что пункт назначения является 8-битным регистром. Значение iin в скобках является адресом одного байта памяти. Кстати, этот адрес: ESP+EDX*4

+1

Проверьте свои объяснения 'movl (% ebp),% esp', я не думаю, что это правильно – harold

+0

Спасибо! Это было очень подробно и полезно. Я на самом деле собирался спросить об этом. Разве это не будет копировать значение, на которое указывает% ebp на% esp? –

+1

Ах! Правильно! Я сделал себе беспорядок с EBP и ESP. Исправлена! –

1

Итак, можем ли мы всегда ожидать, что% esp удерживает значение адреса в команде subl?

По определению да, поскольку следующая инструкция использует его как адрес. Какой бы хлам не было, теперь есть адрес. Если это какая-то дерьмо, как 0xDEADBEEF .. ну, это адрес сейчас. Это может быть или не быть действительным адресом (надеюсь, действительный, недопустимый стек - это плохая вещь), но это другое дело.

Также в чем разница между двумя функциями movl?

Используется в режиме «push» для записи в память, который используется в «pop». Скобки на правой стороне означает, что это запись, с левой стороны это чтение. Так можете ли вы переключить их? Очевидно, нет, это будет делать что-то другое. movl (%ebp), %esp будет читать что-то из памяти, а затем менять, где находится стек.

В качестве продолжения, почему мы не можем иметь источник и место назначения как ссылки на память?

Поскольку вы не можете, такой инструкции не существует. Это не соответствует нормальному operand encoding. Я полагаю, что такая инструкция могла существовать, но это не так, поэтому вы не можете ее использовать.

movb (%esp, %edx, 4), %dh если источник более 1 байт (размер% dh), то что происходит?

Это не по определению, инструкция будет читать 1 байт.

+0

Спасибо! Это прояснило тонну путаницы. –