2009-08-15 3 views

ответ

26

Когда вы пишете на ассемблере , вы точно описываете инструкции для генерации, чтобы он не зависел от ассемблера. Это зависит от тебя. Между мноймикой, которую вы пишете, и фактическими инструкциями в машинный код существует взаимно однозначное соответствие.

+13

Технически это не совсем так; для таких вещей, как режимы адресации, может быть несколько способов кодирования одного и того же местоположения. Существуют и другие изоморфизмы, о которых я забыл; x86 shareware ассемблер с прошлого дня использовал эти изоморфизмы для кода «отпечатка пальца», собранного с ним, с целью ловить читы. –

+1

Я понимаю, что вы говорите. Могут быть разные инструкции машинного кода с аналогичным эффектом. Технически ассемблер может предоставить два разных представления для этих инструкций ('int3' и' int 3') или использовать некоторые подсказки, чтобы выбрать, какой из них нужно сгенерировать. Эти материалы обычно документируются для каждого ассемблера. Думаю, для целей этого вопроса разумно игнорировать эти проблемы, так как теоретически ** они действительно разные инструкции **, и ассемблер может позволить вам выбрать один из них. –

+4

Даже в ассемблере есть место для оптимизации. Многие архитектуры допускают короткие режимы для адресации, например, используя значение байта для относительного смещения вместо длинного. Поскольку эта оптимизация изменяет размер объектного кода, некоторые буферы могут использоваться в короткой форме, поэтому требуется многопроходная оптимизация. AFAIK yasm может это сделать. – hirschhornsalz

4

Это сообщение ... он не оптимизирует код. Он просто переводится как есть. Таким образом, самый быстрый и чистый код создается программистом или компилятором

+1

Ну ладно! Теперь ассемблер также является компилятором? Может ли он сохранить цикл процессора здесь и там? это было мое сомнение ... – 2009-08-16 19:52:41

+1

Ассемблер не является компилятором. Компилятор обычно использует ассемблер. Ассемблер переводит сборку в двоичный код. – tsturzl

2

Очевидно, что nasm потому, что синтаксис Intel выглядит намного чище, чем AT & T синтаксис.

+0

Да, чистый «взгляд» также считается плюсом, я думаю. – 2009-08-16 19:41:35

+4

Я честно предпочитаю синтаксис AT & T. Я думаю, что он передает намерение кода более четкое и выглядит менее загроможденным. Слишком плохо, что там так мало документации. – kmm

+4

+1 Для рекомендации синтаксиса Intel по AT & T. Друзья не позволяют друзьям использовать AT & T. – Jason

1

@ Брайан: это не был вопросом ...

@ cyber98834: Ну, ассемблер делает то, что каждый ассемблер должен делать: переводить все инструкции к ее опкоду.

Нет оптимизации.

О, а также нет такого понятия, как «самый быстрый код» ... Могу ли я задать вам вопрос? Скорость процессора статична, не так ли?

Таким образом, вы не можете сделать код быстрее, потому что вы не можете изменить скорость процессора.

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

Надеюсь, вы понимаете, что я пытаюсь сказать.

Предлагаю вам купить (или посмотреть некоторые pdf-файлы, но я не знаю, является ли это законным) Черная книга графического программирования Майкла Абраша, которая охватывает многие уроки оптимизации.

+0

Привет, SBouazza! Я понимаю вашу точку зрения. Благодаря! У меня уже есть готовое программирование черной книги Майкла Абраша (http://www.gamedev.net/reference/articles/article1698.asp) для более поздней версии :) – 2009-08-16 19:44:17

7

Я не знаю об этих двух конкретных инструментах, но есть некоторые указания, которые могут быть закодированы по-разному:

  • ADD AX,1 является либо 05 01 или 81 c0 01 или fe c0
  • INT 3 либо cc или cd 03
  • Новые инструкции AVX, которые расширяют двухбайтовые инструкции SSE, либо имеют 2-байтовый, либо 3-байтовый префикс. Все двухбайтовые префиксы могут быть закодированы как 3-байтовые префиксы.

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

+0

Большинство ассемблеров обычно выбирают инструкцию с минимальным размером, и они может дать подсказки, позволяющие вам выбрать именно тот, который вы хотите создать. Например, 'cc' и' cd 03' являются двумя отличными инструкциями с точки зрения процессора. Полностью от имени ассемблера выбирать не предоставлять способ генерации инструкции. –

+0

Я согласен, что хороший ассемблер * должен сделать это. Я просто указываю, как ассемблер может сделать что-то другое. Например, «INC AX», закодированный как «fe c0», точно такой же, как «ADD AX, 1', закодирован как« 05 01 »в отношении функциональности и длины инструкции, хотя они действительно декодируются отдельно в CPU. –

+0

Вот что я действительно искал с моим вопросом. Я начинаю изучать сборку x86 (читаю руководство Intel) и хочу использовать инструменты Linux для этого, но сомневался в том, с каким инструментом начать работу. Поскольку кажется, что существует реальная разница между газом и nasm, я заберу nasm из-за более дружественного синтакса. Спасибо за помощь! – 2009-08-16 19:39:12

5

В качестве побочного элемента синтаксиса. Вы можете иметь GAS работать прекрасно с синтаксисом Intel, поместив следующую строку в верхней части исходного файла:

.intel_syntax noprefix 

Я использую синтаксис Intel тоже для всех моих потребностей assmebly. Это кажется гораздо более естественным, чем синтаксис AT & T. И это экономит несколько нажатий клавиш :-).

+0

_Recent_ Газ. Если вы на OS/2, вам может быть не повезло :) –

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