2015-02-24 2 views
1

Очень простой вопрос, но я не нашел хорошего ответа, поэтому я прошу здесь.
Я вижу, что иногда для добавления мы используем инструкцию ADD, и иногда я вижу использование знака плюс (+).
Пожалуйста, посмотрите на следующее:
Инструкция ADD или знак плюс?

mov eax,[esi + TYPE DWORD] 

Ну, я узнал, что для добавления номера я должен использовать команду ADD, но это, кажется, работает, как это.
Я думал, что это должно быть сделано таким образом:

add esi, TYPE DWORD 
mov eax,[esi] 
sub esi, TYPE DWORD 

я имею в виду, как можно получить доступ к компьютеру в памяти адрес еси + ТИП DWORD без выполнения команды Сложить? так странно ...

Спасибо так много для чтения (:

+0

[CISC] (http://en.wikipedia.org/wiki/Complex_instruction_set_computing)? – n0rd

+1

Не попадайте в ловушку мышления 1 мнемоника = 1 инструкция = 1 цикл. – OJFord

+0

@OllieFord it * есть * одна инструкция, хотя, и если бы это была «lea», это была бы однотактная инструкция – harold

ответ

2

Прежде всего, они кодируются как две разные вещи - ADD является инструкцией, придет с полным опкодом, в то время как + будет переведенный вашим ассемблером в режим ссылки для основной инструкции, прилагаемой к нему (MOV).

Главное отличие состоит в том, что первое будет выполняться блоком памяти (точнее - блоком формирования адреса) , не требуя дополнительного арбитража поверх исполнения нагрузки, в то время как последний будет выполняться над ALU и соответственно потребляет необходимые ресурсы (de в вашем примере, на любом современном процессоре не по порядку, который займет как минимум несколько записей в очереди, декодирует слоты, расписание слотов, порты и т. д.).

В этом смысле первый часто «дешевле», поэтому он часто используется даже для обычных арифметических операций без ссылки на память, используя инструкцию LEA, как указал Гарольд.

2

Чтобы перейти к более универсальному, то, что вы смотрите в первом примере, является частью режима адресации, а не op-кода.

Простейшая форма адресных регистров просто указатель на то, что вы заинтересованы в (базовый адрес)

[bx] 

Если вы смотрели на массив или структуру, то вы должны настроить базовый регистр, чтобы посмотреть на что-нибудь еще. Время двигалось, и адресация стала более гибкой. Вы могли бы иметь базу и индекс:

[ebx+eax] ; add 2 registers to get the pointers - array + index 

Теперь, если у вас есть массив байтов вы можете сохранить базу и корректировать индекс. Если вы смотрите на 2, 4 или 8 байт вы можете настроить индекс по размеру цели:

[ebx+eax*2] ; 2 byte target, array + (index*2) 

Теперь, если вы смотрите на структуру с стиле, то вы можете добавить смещение в результирующий адрес тоже:

[ebx+eax*2+16] 

Они закодированы в инструкции во время компиляции, а не в инструкции ассемблера. Ознакомьтесь с режимами адресации - они сэкономит вам много времени, если вы используете правильный режим для правильного решения.

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