Каково практическое применение инструкций x86 RCL / RCR? - PullRequest
5 голосов
/ 06 апреля 2019

Меня интересуют практические приложения , даже если они устарели по современным стандартам.

Здесь похожий вопрос о ROL и ROR здесь , но он не совсем отвечает о RCL / RCR.

Я могу придумать некоторые приложения для RCL, RCR с операндом 1 (т.е. для некоторых LFSR), но я не могу вспомнить ни одного разумного приложения с операндом, отличным от 1 .

Так может ли кто-нибудь просветить меня?

P.S. Пример кода более чем приветствуется.

обновление 1 : так как Peter Cordes упоминается в комментариях ниже, одно (вполне очевидное) приложение - это shrd / shld. (Инструкции IIRC rcl / rcr были уже в 8080 году)

Возможно, «non 1» выше было неясно, но имейте в виду, что я в основном заинтересован в использовании, где операнд есть! = 1 (RC(L|R) REG, c с c, равным> 1 или == cl).

1 Ответ

4 голосов
/ 06 апреля 2019

В операциях сдвига эти инструкции играют ту же роль, что и инструкции сложения с переносом (adc) или вычитания с переносом (sbb) в дополнениях:

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

Пример: на процессоре 386 можно выполнять 32-разрядные операции с использованием одной инструкции,Однако вам может потребоваться обработать 320-разрядные целые числа.

Допустим, у нас есть 4-разрядный ЦП, и мы хотим выполнить операцию "арифметического сдвига вправо" (sar) на 16-разрядномцелое число:

Integer: ABCDEFGHIJKLMNOP  (A-P = some bits that may be 1 or 0)

Operation on a 16 bit CPU:

    ABCDEFGHIJKLMNOP (SAR 1) -> AABCDEFGHIJKLMNO, CF = P

Operation on a 4 bit CPU:

    ABCD (SAR 1) -> AABC, CF = D
    EFGH, CF = D (RCR 1) -> DEFG, CF = H
    IJKL, CF = H (RCR 1) -> HIJK, CF = L
    MNOP, CF = L (RCR 1) -> LMNO, CF = P

So the final result on the 4-bit CPU is AABCDEFGHIJKLMNO, CF = P

Конечно, тот же пример будет работать с 256-битным числом на 64-битном процессоре ...

Обратите внимание:

Используя add/adc, sub/sbc или shl/rcl, мы начинаем с младших бит и продолжаем с старших бит.Однако, используя shr/rcr или sar/rcr, это наоборот.

...