Главная страница
Предыдущая страница (строковые операции)

Команды сдвига

1) shl|shr|sal|sar приёмник, число|cl – команды сдвига. Если указан регистр cl, то у него учитываются только младшие 5 бит. shl и sal – совершенно одинаковые. Более того, код этих команд также одинаковый. Просто психологически воспринимается немного по-разному (тут арифметический сдвиг, а тут логический). sar отличается от shr тем, что не обнуляет старший бит, поэтому почти эквивалентна знаковому делению на 2, но в отличие от idiv, округление происходит не в сторону нуля, а в сторону отрицательной бесконечности. shl|sal – переводят старший бит в CF. shr|sar переводят младший бит в CF. Сдвиги на 1 изменяют значение OF: shl|sal устанавливают его в 1, если старший бит изменился, иначе OF=0. shr устанавливает OF в значение старшего бита исходного числа, а sar обнуляет OF. Для сдвигов на несколько битов значение OF не определено. ZF, SF, PF назначаются в соответствии с результатом; AF не определён. Разрядность операндов – 8|16|32
shr
sar
sal|shl

2) ror|rol приёмник, счётчик – циклический сдвиг вправо|влево
2) rcr|rcl приёмник, счётчик – циклический сдвиг вправо|влево через флаг переноса
Приёмник – регистр|переменная, счётчик – число|cl, из которого учитываются младшие 5 бит. При выполнении циклического сдвига команды ror|rol перемещают каждый бит приёмника вправо|влево на одну позицию, за исключением младшего|старшего, который записывается в позицию старшего|младшего бита. Например, если ah=01100100b после выполнения ror ah, 4 будет ah=01000110b. После выполнения команд циклического сдвига флаг CF всегда равен последнему вышедшему за пределы приёмника биту. Например, после выполнения: mov al, 00001011b; ror al, 4; флаг CF будет равен 1 (той, которая была третьим битом в al). Флаг OF определён только для сдвигов на 1 – устанавливается, если изменялось значение старшего бита, иначе сбрасывается. Флаги SF, ZF, AF, PF не изменяются

3) shrd|shld приёмник, источник, счётчик – сдвиг повышенной точности вправо|влево. Приёмник (регистр|переменная) сдвигается вправо|влево на число бит, указанное в счётчике (число|cl). Если счётчик – регистр cl, то учитываются только младшие 5 бит. Старший (для shld) или младший (для shrd) бит не обнуляется, а считывается из источника (регистр), значение которого не меняется. Например, если приёмник содержит 00000000 01000101b (69), а источник – 10101010 10101010b (43690), счётчик=3, то shrd даст в результате 01000000 00001000b (16392), а shld даст в результате 00000010 00101101b (557). Разрядность приёмника и источника – 16|32


Следующая страница (операции над битами и байтами)