변속하기 전에 변속 횟수를 확인하십시오. 시프트 카운트가 비트 수보다 크면 오버플로가 발생합니다.일반적으로 플래그를 확인합니다. 그러나 실제로
SHL
(또는
SAL
동일한 지침) 에 의존 할 수는 없습니다 . 소프트웨어 개발자 매뉴얼을보십시오 :
영향을받는 플래그
CF 플래그에는 대상 피연산자에서 시프트 된 마지막 비트의 값이 포함됩니다. 카운트가 대상 피연산자의 크기 (비트)보다 크거나 같은 SHL 및 SHR 명령어에 대해서는 정의되지 않습니다. OF 플래그는 1 비트 시프트에 대해서만 영향을받습니다 (위의 "설명"참조). 그렇지 않으면 정의되지 않습니다. 결과에 따라 SF, ZF 및 PF 플래그가 설정됩니다. 개수가 0이면 플래그는 영향을받지 않습니다. 0이 아닌 카운트의 경우 AF 플래그가 정의되지 않습니다.
가장 좋은 방법은 시프트 전에 시프트 카운트가 바이트 연산의 경우 <4, 단어의 경우 <5, 더블 워드의 경우 <6, quadwords의 경우 <7인지 확인하는 것입니다.
편집하다:
사양을 잘못 읽었습니다. 시프트 카운트가 대상 피연산자보다 크지 않으면 CF 플래그를 확인하여 시프트 된 마지막 비트를 볼 수 있습니다. 한 번에 한 비트 씩 시프트를 수행하는 경우 각 시프트 후에 CF를 테스트하여 오버플로를 나타내는 1이 어떤 지점에서 시프트되었는지 확인할 수 있습니다.
또 다른 옵션은 산술 시프트 수행하는
권리를
쉬프트 왼쪽과 같은 수를 가지고 있는지 확인 후 :
mov ebx, eax
sal eax, ecx
sar eax, ecx
cmp ebx, eax
jnz overflow
출처
https://stackoverflow.com/questions/7415163