Ассемблер shl: инструкция сдвига влево и связанные с ней операции
Шифт влево (shl) - это команда ассемблера, которая выполняет операцию сдвига влево над содержимым регистра или памяти. В результате операции, все биты значения сдвигаются влево на указанное количество позиций. На пустые позиции слева записываются нули, а самый левый бит, который выбывает из значения, переходит в флаговый регистр.
Примеры кода на ассемблере, использующие команду shl:
Пример 1: Сдвиг влево значения в регистре
section .data
value db 0b00001111 ; Значение для сдвига
section .text
global _start
_start:
mov al, [value] ; Загрузить значение из памяти в регистр AL
shl al, 2 ; Сдвиг влево на 2 позиции
; Теперь в AL будет содержаться значение 0b00111100
Пример 2: Сдвиг влево значения в памяти
section .data
value db 0b00001111 ; Значение для сдвига
section .text
global _start
_start:
lea esi, [value] ; Загрузить адрес значения в регистр ESI
mov al, byte [esi] ; Загрузить значение из памяти по адресу, на который указывает ESI, в регистр AL
shl al, 3 ; Сдвиг влево на 3 позиции
mov byte [esi], al ; Сохранить результат обратно в память
; Теперь значение в памяти будет равно 0b01111000
Пример 3: Сдвиг влево значения и использование флагового регистра
section .data
value db 0b11110000 ; Значение для сдвига
section .text
global _start
_start:
mov ah, 0 ; Обнулить регистр AH
mov al, [value] ; Загрузить значение из памяти в регистр AL
shl ax, 1 ; Сдвиг влево на 1 позицию
; Теперь в регистре AX будет содержаться значение 0b11100000
; Флаг CF останется нулевым, так как наиболее значимый бит
; (который выбывает из значения) равен нулю
mov ah, 0 ; Обнулить регистр AH
mov al, [value] ; Загрузить значение из памяти в регистр AL
shl ax, 4 ; Сдвиг влево на 4 позиции
; Теперь в регистре AX будет содержаться значение 0b00000000
; Флаг CF будет равен 1, так как все биты значения "выбыли" и стали нулями
Все приведенные выше примеры демонстрируют сдвиг влево. Значение или регистр сдвигаются на указанное количество позиций влево, а пустые позиции слева заполняются нулями. Команда shl может быть использована для умножения значения на два, так как сдвиг влево на одну позицию эквивалентен умножению значения на 2.