sar

Arithmetic shift right

Shifts the destination right arithmetically by the given count, filling the top bits with copies of the sign bit.

8086 and later

Intel's reference: SAL/SAR/SHL/SHR

Used in
CFPFAFZFSFDFOF ●●?●●–?
  • ● set from the result
  • ? undefined afterwards
  • – not changed
  • OF Defined only for a count of 1.
  • A count of 0 leaves every flag unchanged.

Forms

Operands

r/m
A general-purpose register or memory location matching the operation’s size, for example rax or qword [rbp-8]. The byte registers ah, bh, ch and dh cannot be used with a REX prefix, including when the memory address uses r8–r15.
imm8
An 8-bit immediate, -128 to 255. Instructions that sign-extend it to a wider operand interpret the byte as -128 to 127; shift counts do not use this sign extension.

shl and its synonym sal shift left and fill low bits with zeros. shr shifts right and fills high bits with zeros; sar shifts right and repeats the original sign bit. When defined, CF receives the last bit shifted out. OF is defined only for a count of one; CF is undefined for a shl or shr count at least as large as the operand width.

The count comes from an immediate or cl. A 64-bit operand uses the low six bits of the count; 8-, 16- and 32-bit operands use the low five. Thus shl rax, 32 shifts by 32, while shl eax, 32 has a masked count of zero.

global _start

section .text
_start:
        mov rax, 12
        mov rbx, 5
        mov rcx, 3
        mov rsi, 9

        sar rax, 1

        mov rax, 60         ; syscall 60: exit
        xor rdi, rdi
        syscall