Некоторые вопросы сборки относительно увеличения, уменьшения и умножения - PullRequest
1 голос
/ 12 февраля 2011

Я сталкиваюсь с некоторыми вопросами, так как они недостаточно четко описаны в учебнике по сборке IA-32, который я изучаю:
1-Является ли нулевой бит в части состояния регистра EFLAGS единственным битом среди битов состояния, на которые влияют команды "INC" (увеличение) и "Dec" (уменьшение), или на бит четности также влияют?
2-Влияет ли команда mul (умножение целых чисел без знака) на часть состояния регистра EFLAGS?

И, наконец, есть предложение, я не уверен, правильно ли я понимаю:
"инструкция IMUL может использоваться как целыми числами со знаком, так и без знака, хотя вы должны быть осторожны, чтобы в результате не использовался старший значащий бит назначения. Для больших значений инструкция IMUL действительна только для целые числа со знаком. "
Моя концепция заключается в том, что когда вы собираетесь использовать эту инструкцию (которая имеет три формата) для умножения целых чисел без знака, у операндов должен быть ноль в их старшем значащем бите, поэтому в этом случае не следует использовать этот бит; и когда намерение состоит в том, чтобы сделать целочисленное умножение со знаком, операнды естественным образом будут использовать самый значимый бит в качестве своего знакового бита. Так я прав?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Многие / большинство ссылок на наборы команд скажут вам, на какие флаги влияют какие инструкции, например этот: http://home.comcast.net/~fbui/intel.html

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

В другом месте в документации вы должны будете найти, что означают буквы, большинство процессоров ссылаются на Z, V, N и C. Ссылка, которую я привел выше, конечно, использует различные символы для обозначения флагов, поэтому вы должны найти таблица, которая скажет вам, какие флаги какие, а затем найдите инструкции, заданные в вопросе.

Это охватывает вопросы 1 и 2.

По третьему вопросу понимание придет, когда вы ответите на вопрос «в чем разница с побитовой точки зрения между знаковыми и беззнаковыми числами». Я считаю, что проще всего думать с точки зрения 2 или 3 бит, зная, что основные понятия расширяются. Так, например, если подумать в терминах 3 битов, как битовая комбинация 0b011 интерпретируется как битовая комбинация без знака, как она интерпретируется как битовая комбинация со знаком? Как насчет 0b111? Как насчет 0b001? А 0b101? А что дает 0b011 умножить на 0b010, если вы делаете это с использованием чисел без знака? Как подписаны номера?

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

Теперь попробуйте несколько интересных 4-битных случаев (несколько с установленным верхним битом и несколько без) и решите, получите ли вы для 4-битных результатов те же результаты, что и с 3, тогда, возможно, с помощью калькулятора попробуйте 8 или 16-битные числа и решить, применяется ли правило для любого количества бит или если оно изменяется. Затем решите, отвечает ли то, что вы узнали о 3-битных числах, или, по крайней мере, поясняет утверждение / вопрос относительно размера операндов в инструкции IMUL IA-32.

1 голос
/ 12 февраля 2011

1) Нет, эффективными флагами являются O, S, Z, A и P.

2) Да, прогнозными (полезными) флагами являются O и C, но флаги S, Z, A и P являютсяпосле непредсказуемой инструкции IMUL.

3) Да, последний бит (MSB) является знаком, если знак равен 0, то число положительное, поэтому алгоритм деления одинаков для обоих типов чисел.

...