Необходимо ли, чтобы каждый машинный код мог отображаться только на один код сборки? - PullRequest
2 голосов
/ 07 апреля 2010

Предположим, что эти два по сути одинаковы:

push 1

и

0x1231

То есть каждая инструкция по сборке отображается на машинный код.

Но необходимо ли, чтобы каждый машинный код мог отображаться только на один код сборки?

Ответы [ 7 ]

4 голосов
/ 07 апреля 2010

Язык ассемблера MIPS имеет несколько «псевдоинструкций». Например, «move» внутренне является просто «add» с неявным операндом $ 0.

3 голосов
/ 07 апреля 2010

Вы могли бы прекрасно определить ассемблерную программу, которая поддерживает «синонимы» для инструкций: никакого вреда не будет, если вы позволите пользовательскому коду FOO означать то же самое, что и BAR.Я не знаю ничего от ассемблеров, которые делают это, но вы, безусловно, можете добиться того же эффекта с помощью тривиально простого макроса в любом макро-ассемблере; -).

2 голосов
/ 07 апреля 2010

Да. Реальный пример этого - 68k ассемблер , где

Официальная мнемоника BCC (филиал на нести ясно) и БКС (филиал на керри установить) можно переименовать в BHS (ветвь на выше или такой же) и BLO (филиал на меньше чем) соответственно. Много 68000 монтажников поддерживают эти альтернативная мнемоника.

2 голосов
/ 07 апреля 2010

Даже без синонимов инструкция по сборке может отображаться на более чем один машинный код.
Например. add eax, ebx может быть представлен как 03 C3 или 01 D8.
На самом деле это может быть полезно, например, идентифицировать конкретные компиляторы.
Вы можете найти больше примеров в этой статье .

Обратное также может быть правдой, в некотором роде.
Пример немного надуманный, но тот же машинный код (F3 90) отображается на REP NOP или PAUSE на x86.
Какой из них выполняется, зависит от процессора, на котором выполняется код.
Хотя тот же код операции был выбран намеренно и в отношении состояния процессора, они не имеют значения , время выполнения - и точная внутренняя реализация - может отличаться на процессоре HT (PAUSE) и не HT (NOP).

Помимо PAUSE против REP NOP, который не имеет большого значения, можно написать машинный код, который сложно разобрать статически.
Например. можно аккуратно построить последовательность машинного кода, которая приведет к совершенно другим инструкциям по сборке, если разборка начинается, скажем, со смещения 0 против смещения 1.
Можно также написать самоизменяющийся ассемблерный код, чтобы усложнить статический анализ.

0 голосов
/ 07 апреля 2010

То, что делает конкретная инструкция машинного кода, определяется процессором (или семейством процессоров), для которого она предназначена. И одна и та же инструкция машинного кода всегда делает одно и то же.

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

Однако для архитектуры возможно существование нескольких целых наборов сборок. Это произошло для архитектуры x86, где есть стандартный набор, определенный Intel, а затем есть другой, основанный на одном, созданном AT & T, который используется GCC.

0 голосов
/ 07 апреля 2010

Как правило, точка сборки заключается в том, чтобы позволить вам напрямую программировать машину без двусмысленности в отношении того, что будет выполнено. В значительной степени требуется отображение 1: 1.

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

0 голосов
/ 07 апреля 2010

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

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

...