Вопрос ассемблера x86 - PullRequest
3 голосов
/ 16 мая 2010

У меня есть 2 простых, но, может быть, каверзных вопроса. Допустим, у меня есть инструкция ассемблера: MOV EAX, [ebx + 6 * 7] - мне интересно, действительно ли эта инструкция действительно переводит в код операции в том виде, в каком она есть, поэтому вычисление кода в скобках кодируется в код операции или это просто псевдоинструкция для компилятора, CPU, так что компилятор до этого вычисляет значение в скобках, используя add mul и т. Д., Сохраняет результат в некотором регистре, а затем использует MOV EAX, reg с вычисленным значением? Просто чтобы быть ясно, я знаю, что результат будет таким же. Я заинтересован в исполнении.

Второй - инструкция LEA. Я знаю, что он делает, но меня больше интересует его настоящая инструкция, поэтому компиляция не меняет его дальше, просто превращает его в код операции в том виде, в котором он стоит, или просто псевдокод для компилятора, чтобы снова вычислить адрес и сохранить его ,

Ответы [ 2 ]

5 голосов
/ 16 мая 2010

Ассемблер (не компилятор, хотя он очень похож) обработает бит 6*7 как 42, а затем инструкция:

MOV EAX,[ebx+42]

Это то, что процессор может выполнить, добавив содержимое регистра ebx и константу 42, затем используя этот адрес для загрузки eax. Нет инструкции, которая кодирует 6 и 7 как разные объекты, которые были бы умножены позже.

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

Вам нужно только подумать об инструкции:

mov ax,1+1+1+1+1+1+1

Это не будет закодировано как некоторая (магическая) последовательность байтов eb 01 01 01 01 01 01 01, оно будет закодировано точно так же, как любое из следующего:

mov ax,7
mov ax,49-42
mov ax,42/6
3 голосов
/ 16 мая 2010

1) Да
2) Да

есть. они оба переводят точно в кодировку кода операции.

Имейте в виду, однако, что базовая архитектура современных процессоров X86 ОЧЕНЬ отличается от того, на что вас ожидает ассемблер. То есть, если она становится отдельной инструкцией, это не означает, что она будет обрабатываться как одна инструкция на процессоре.

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