ARM арифметическое добавление и обновление флагов - PullRequest
3 голосов
/ 04 июля 2011

Я читаю сборочную книгу ARM Дж. Гибсона, глава 5. В пояснениях к целочисленным инструкциям ADD и SUB приведена таблица для обновления флага после вычисления результата.

Чем я не являюсьв состоянии понять, является ли флаг обновлением целого числа без знака для 2 целых чисел A, B, где A и B "не оба равны 0", а результат равен 2^31-1 < result < 2^32 (то есть между 0x7FFFFFFF, 0x100000000)

В нем говорится, что приведенные выше результаты приводят к установке флагов N=1, Z=0, C=0, V=X (все равно) и расширению мнемонических инструкций команд как

EQ = No, NE = Yes, CS = No, CC = Yes, MI = Yes, PL = No, VS, VC = X, HI = No, LS = Yes, LT, GT, LE = X

Почему добавление без знака, приводящее к значению в пределах 32-битного диапазона, вызывает установку N бит (и, следовательно, MI и LS равны Yes)

Что я ожидал, так это *Можно установить флаг 1027 *, поскольку 31-й бит равен 1 (считая от бита 0), но в любом случае результат является положительным (т. Е. PL = Yes, поскольку он находится в диапазоне 2^31-1 ~ 2^32).

Я что-то здесь не понимаю?

Ответы [ 2 ]

3 голосов
/ 04 июля 2011

Флаг N всегда устанавливается в бит 31 результата.Процессору все равно, сложить или вычесть числа со знаком или без знака - результирующая битовая комбинация одинакова в обоих случаях.Точно так же суффиксы PL / MI просто проверяют наличие флага N;им все равно, считаете ли вы числа подписанными или беззнаковыми.

Подпись важна для умножения и деления, поэтому в этих инструкциях есть две мнемоники.

2 голосов
/ 05 июля 2011

Вычитание и сложение (можно) использовать один и тот же сумматор (логику), вычитание подает на один вход сумматора обратный операнд, а затем устанавливает перенос, сложение передает операнды прямо через и обнуляет перенос.инвертировать и добавить один) Подпись и неподписанный материал, когда дело доходит до переполнения (при сложении / вычитании).C - бит переполнения без знака, а V - бит переполнения со знаком.Аппаратные средства не заботятся, обычно, если инструкция генерирует одну, она генерирует их обе.Язык высокого уровня и / или пользователь заботятся о том, что аппаратное обеспечение просто делает то, что в основном является неподписанным дополнением, и устанавливает флаги.

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

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

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