Что не так с моим выводом этого результата флага переноса для SUB?

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

Я пытаюсь доказать, что инструкция x86 setb действительно реализует x<y как беззнаковое сравнение при использовании после инструкции cmp. В частности, давайте рассмотрим (синтаксис ATT, а суффиксы, указывающие количество бит, я пренебрегу)

# Compare two registers, e.g., %eax and %ebx with values y and x, respectively, when unsigned
cmp %ebx, %eax

# Set %al to 1 if %eax is below %ebx (unsigned comparison)
setb %al

Утверждается, что %al получает значение 1 в конце этого выражения тогда и только тогда, когда значения x,y подчиняются x<y, если считать их беззнаковыми. Обратите внимание, что в синтаксисе ATT инструкция cmp вычитает содержимое %ebx из содержимого %eax и что эта операция соответствующим образом устанавливает соответствующие флаги условий, включая флаг выполнения, который здесь представляет интерес. То есть битовый шаблон помещается в модуль вычитания для вычисления x(-^u)y, где я использую это обозначение для описания вычитания без знака, а - для описания вычитания соответствующих целых чисел.

Теперь вот моя проблема. Предположим, x<y. Мы хотим показать, что выполнение является результатом вычитания. Предположим, что каждое число состоит из w бит. Я знаю (из моего сообщения, CS:APP3e Брайанта и О'Халларона), что

x(-^u)y := x(+^u)((-^u) y) = x(+^u)(2^w - y) = 2^w + x - y < 2^w,

поэтому якобы никакого выполнения получено не было, поскольку результат укладывается в наши w биты. То есть никакого выполнения. Это только одно направление «доказательства», но я уже ясно вижу, что не прав. Хотя где я ошибаюсь?

sub и cmp в x86 устанавливают CF, если есть заимствование из вычитания. Это тот случай, когда нет переноса от сложения обратного (с переносом 1). Некоторые другие ISA (например, ARM) противоположны x86 для sub, устанавливая свой флаг переноса непосредственно при выполнении двоичного сумматора-вычитателя. en.wikipedia.org/wiki/Adder%E2%80%93вычитатель . Также по теме: Арифметические тождества и EFLAGS

Peter Cordes 02.08.2024 05:40

Понял. Итак, вы говорите, что когда выполняется вычитание (предположительно с использованием аппаратного сумматора при дополнении вычитаемого и добавлении 1 для получения дополнения до 2, как это стандартно в компьютерных архивных книгах), блок сумматора/вычитателя фактически дополняет выходной перенос в случае вычитания. , и этот дополненный перенос — это то, что мы видим как флаг CF? @PeterCordes

EE18 02.08.2024 15:32

Да, для x86 и некоторых других ISA, в отличие от ARM и некоторых других.

Peter Cordes 02.08.2024 23:33

Супер, как всегда спасибо за помощь! Буду рад принять ответ на этот счет, если хотите. @PeterCordes

EE18 03.08.2024 01:19

Я не понимаю приоритет операторов =, := и < в вашем выражении выше. Не могли бы вы ввести скобки, чтобы было понятно?

Erik Eidt 03.08.2024 02:43

Мои извинения, я намеревался попытаться использовать стандартные математические обозначения, но на этом сайте нет MathJax, поэтому моя попытка потерпела неудачу. Кстати, := «равно по определению», = равно, < меньше. То есть они используются в математическом смысле, а не в смысле языка программирования. @ЭрикЭйдт

EE18 03.08.2024 04:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

sub и cmp в x86 устанавливают CF, если есть заимствование из вычитания. Это тот случай, когда нет переноса от сложения побитового обратного числа с переносом 1, как это делает двоичный сумматор-вычитатель в ALU.

Некоторые ISA (например, ARM) противоположны x86 для sub, устанавливают свой флаг переноса непосредственно из выполнения сумматора-вычитателя. x86 (и некоторые другие ISA) инвертируют его.

Связано: Арифметические тождества и EFLAGS — обратите внимание, что правильный asm, эквивалентный sub, — это одно сложение с переносом 1 и cmc, а не отдельные neg и add, если вас волнует результат EFLAGS.

Другие вопросы по теме

Похожие вопросы