책에,
\"여러가지 시프트 인스트럭션들은 시프트할 양을 즉시 값이나 단일 바이트 레지스터 %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가 나오는 건 아닌거 같은데 어떻게 저 숫자가 정해지는건지 알려주세요...
수를 쉬프트하기전에 쉬프트 할 수를 비트레벨에서 보면
salb는 바이트 하나를 쉬프트하는건데 바이트 하나는 8자리니까 7번까지는 쉬프트가 유효한데 그보다 쉬프트를 해버리면 의미가 없음
salw는 이제 16자리니까 15번까지만 sall은 32자리니까 31번까지만 이런식으로
그래도 잘 모르겠습니다만 친절하게 알려주셔서 고맙습니다
한국어가 모국어인데도...저기 올린 내용이 무슨 말인지 도통 모르겠네요..여하간 쉬프트 인스트럭션을 사용하는 주된 이유 중 하나는 곱셈과 나눗셈을 대체하기 위함입니다....(물론 다른 이유도 있습니다만....위 내용은 고바기랑 나누기를 설명하는거 같네요)....sal는 곱셈....sar은 나눗셈입니다..다만 제약이 있어여..2의 승수승으로만 가능합니다..그러니까 sal을 사용하여 왼쪽으로 한 비트 이동하면 2를 곱하는 게 됩니다....왼쪽으로 두 비트 옮기면 2^2을 곱하는게 되고 왼쪽으로 3비트 이동하면 2^3을 곱하는게 되죠....sar은 나눗셈인데 sal과 반대인거죠...어케 이해되셨나유?