2013-02-16 2 views
1
// Code I'll be working with 
int shift_left2_rightn(int x, int n) 
{ 
    x <<= 2; 
    x >>= n; 
    return x; 
} 

질문 1 좌 시프트 = SALSHL. 제 책에는 그들이 같은 효과가 있다고합니다. 그런데 왜 2 교대 작업이 있습니까? 예를 들어ATT 어셈블리 (산술 및 논리 연산)

는 :

movl 8(%ebp), %eax //Get x 
_______     //x <<= 2 

내 책은 또한 정답이었다

sall $2, %eax 

shll $2, %eax 

의 답을 준다?

질문 2 : 쉽게 설명하자면

SHRSAR의 차이점은 무엇입니까? 저의 책은 논리 시프트 (0으로 채워짐)이고 다른 하나는 산술 시프트 (부호 비트의 복사본으로 채우기)라고 말합니다.

0의/부호 비트를 채우십시오.

가 어떻게하여 다음의 지침을 사용할 일 알 것 : 예를 들어

? 이 책의

movl 12(%ebp), %ecx //Get n 
______     //x >>=n 

돌아 가기

sarl %cl, %eax 

우리가 shrl를 사용한 경우 무슨 일이 일어날 지 나에게 설명해주십시오 답을 가지고있다.

이해해 주셔서 감사합니다.

답변

4

salshl은 동일한 opcode를가집니다. sar으로

가 음의 무한대 (-Inf)을 향해 2 개 반올림 번호로 구분을 체결 않으며, shr 2에 의해 분열을 서명되지 않으며, 아마도 인텔의 엔지니어들은 모두 salshl들이 동의어 경우에도 통합하기로 결정했습니다.

여기 shrsar이 무엇 예입니다 :

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement) 

shr al,1   ; 0b01000100 = 68d = 68d (2's complement) 

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement) 

sar al,1   ; 0b11000100 = 196d = -60d (2's complement) 

그래서 shr가 제로로 채우고 sar는 부호 비트를 채 웁니다.

shr은 일반적으로 부호없는 나누기 또는 비트 시프트 용이고 부호있는 나누기는 sar입니다.

+0

예제와 설명을 해주셔서 감사합니다 – juice

+2

실제로'sal'과'shl'을위한 두 개의 다른 opcode가 있습니다 만, 지금까지의 행동은 똑같습니다. 인텔이 두 가지 중 하나를 사용하지 않으려는 것처럼 보입니다. 선적 서류 비치. –

+0

@AlexeyFrunze 어느 것? [인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software- developer/manual-325462.html)'sal'과'shl'에 대해서'REX'의 유무에 관계없이'DO/4','D2/4','C0/4 ib','D1/4','D3/4','C1/4 ib'. 또한 예를 들어 조립하면. 'sal al, 1'을 NASM으로 보내면'D0 E0'이되고 ndisasm은'shl al, 1'로 디스 어셈블합니다. – nrz

0

실제로 두 개의 다른 연산이 없으며 동일한 명령어에 대해 두 개의 이름 만 있습니다.

오른쪽으로 시프트하면 부호있는 값 (SAR)과 부호없는 값 (SHR) 사이에 차이가 있으므로 한 작업 부호가 확장되고 다른 부호는 확장되지 않습니다.

왼쪽으로 이동할 때 차이는 없지만 오른쪽 시프트가있는 대칭의 경우 두 개의 이름 (SAL 및 SHL) 만 남습니다. 둘 다 동일한 기계 코드에 매핑됩니다.

+1

실제로'sal'과'shl'을위한 두 개의 다른 opcode가 있습니다 만, 지금까지의 동작은 동일했지만, Intel이 문서로 판단 할 때 두 가지 중 하나를 사용하지 않으려한다고합니다. –