책에,

\"여러가지 시프트 인스트럭션들은 시프트할 양을 즉시 값이나 단일 바이트 레지스터 %cl로 명시할 수 있다(이 인스트럭션들은 특정 레지스터만을 오퍼랜드로 허용하는 점이 일반적이지 않다) 원칙적으로 1바이트 시프트 양은 2의 8제곱 ㅡ 1 = 255까지 가능하도록 한다. x86-64에서는 w바이트 길이의 데이터 값에 적용하는 시프트 연산은 레지스터 %cl의 하위 m비트로 시프트 양을 결정하며 2의 m제곱 = w의 관계가 성립한다. 상위 비트들은 무시된다. 그래서 예를 들어, 레지스터 %cl이 16진수 값 0xFF를 가질 때, 인스트럭션 salb는 7만큼 시프트하고 salw는 15, sall은 31, salq는 63만큼 시프트하게 된다\"

라고 합니다만 무슨 소리인지 모르겠습니다.

바로 아래 연습문제에서 long타입 x, n을 매개변수로 받는 함수를 줬는데 x<<=4가 movq %rdi, %rax salq $4, %rax이고 x>>=n은 movl %esi, %ecx sarq %cl, %rax가 되네요.

C코드에서 4만큼 시프트해서 저 인스트럭션에서 그대로 4가 나오는 건 아닌거 같은데 어떻게 저 숫자가 정해지는건지 알려주세요...