Язык ассемблера: + против добавления - PullRequest
3 голосов
/ 16 декабря 2010

Я студент университета, изучаю ассемблер самостоятельно. Я заметил, что, хотя есть инструкции типа add и mul, в инструкциях часто используются арифметические операторы. Например:

mov eax,[ebx+ecx]

Это эквивалентно следующему?

add ebx,ecx
mov eax,[ebx]

(игнорируя изменение содержимого ebx)

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Почти ... Этот метод индексного адреса ([ebx + ecx] или любой другой) обычно используется для адресации элементов в некотором массиве или записи.В вашем случае ebx может быть указателем на байтовый массив, а ecx является индексом.Использование индексной адресации может быть опасным, потому что после арифметических операций не существует обработанных флагов, поэтому мы не можем проверить переполнение диапазона массива.Обычно высокоуровневые компиляторы в режиме отладки используют классический более медленный метод, так что мы можем обнаружить переполнение диапазона массива.Когда мы переключаем компилятор в режим пересылки (и мы уверены, что больше нет возможных ошибок), используется более быстрый метод адресации индекса.

2 голосов
/ 16 декабря 2010

Нет, это не эквивалентно. Если это реальный код, то вещь в скобках является примером режима адресации . Режим адресации управляет тем, как вычисляется эффективный адрес для операции, но обычно он не имеет постоянного эффекта. Ваш второй фрагмент кода фактически добавляет в регистр ebx, изменяя его содержимое для любых следующих инструкций.

Обновление: я только что видел ваше последнее предложение о игнорировании изменений ... Если вы хотите игнорировать это, тогда да, я считаю, что эти два фрагмента эквивалентны.

1 голос
/ 16 декабря 2010

Что касается чтения чего-либо из памяти, они функционально одинаковы.Уже упомянутые различия не изменяют флаги, когда они используются строго для адресации смещения регистра [ebx + ecx], и что вы изменяете ebx и уничтожаете свой базовый адрес.Вы также потребляете вдвое больше инструкций, в два раза больше выборок.x86 - переменная длина инструкции, это не обязательно означает, что инструкции будут в два раза больше, но это означает, что для выполнения той же задачи требуется больше тактовых циклов и больше места в кеше.в свое время, и я рекомендую изучить другие наборы инструкций (ARM, thumb, mips, msp430, avr и т. д.).Вы часто будете видеть эти компромиссы, иногда вы специально захотите сделать это, не разрушая регистр и не изменяя флаги.Иногда вы хотите или нуждаетесь в адресации смещения регистра, чтобы сделать код быстрее или чище, чем потреблять регистр и дополнительную инструкцию для каждой ссылки в каждом цикле, например.Зная, что многие процессоры имеют адресацию смещения регистра, вы можете написать свой высокоуровневый код, чтобы воспользоваться этими преимуществами, например, если вы заинтересованы в производительности, как общей, так и целевой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...