x86 арифметическое управление переполнением - PullRequest
1 голос
/ 14 сентября 2011

Знаете ли вы какой-нибудь способ эффективной проверки, если арифметически происходит сдвиг влево на x86?

1 Ответ

2 голосов
/ 14 сентября 2011

Просто проверьте счетчик смен, прежде чем переходить.Если число сдвигов больше числа битов, вы получите переполнение.

Обычно вы проверяете флаги для этого.Тем не менее, вы не можете действительно полагаться на них для SHL (или SAL, что является той же самой инструкцией).Посмотрите в Руководстве разработчика программного обеспечения:

Затрагиваемые флаги

Флаг CF содержит значение последнего бита, сдвинутого из операнда назначения;он не определен для команд SHL и SHR, где число больше или равно размеру (в битах) операнда назначения.На флаг OF влияют только сдвиги в 1 бит (см. «Описание» выше);в противном случае он не определен.Флаги SF, ZF и PF устанавливаются в соответствии с результатом.Если количество равно 0, флаги не затрагиваются.Для ненулевого счетчика флаг AF не определен.

Лучшим способом является обеспечение того, чтобы счетчик сдвига был <4 для байтовых операций, <5 для слов, <6 для двойных слов и <7 длячетыре слова, до смещения. </p>

Редактировать:

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


Другой вариант -выполнить арифметический сдвиг вправо после сдвига влево и посмотреть, получили ли вы тот же номер:

mov ebx, eax
sal eax, ecx
sar eax, ecx
cmp ebx, eax
jnz overflow
...