2014-04-05 2 views
0

일부 인라인 어셈블리를 탐구하려고합니다. 흥미로운 부분이지만 문서가 부족하고 newb가 친숙하지 않습니다. 예상대로인라인 asm, 언제 r을 사용하고 m? 왜이 행동?

이 코드는 작동 올바르게

{ 
int other_var=3; 
asm volatile 
(
    "mov $3,%0\n\t" 
    "roll $2,%0;" 
    :"=r"(other_var) 
    :"r"(other_var) 
); 
cout << "other_var equals " << other_var <<endl; 
return 0; 
} 

승산하지만 겉보기 임의 MOV를 제거 할 때

int other_var=3; 
cout << "other_var equals " << other_var <<endl; 
asm volatile 
(

    "roll $2,%0;" 
    :"=r"(other_var) 
    :"r"(other_var) 
); 
cout << "other_var equals " <<hex<< other_var <<endl; 
return 0; 
} 

는 코드처럼 미정 동작 쓰레기를 출력한다. 갑자기 프로그램이 메모리에서 other_var를 레지스터에로드하지 않고 "= m"및 "m"옵션이 필요합니다. 왜 그런가요? 내가 누락 된 정보는 무엇입니까?

답변

0

자주 참고 도서, pdf 또는 웹 사이트를 찾아야합니다. 1은 인라인 어셈블리의 매우 특정한 컴파일러 특성을 설명하고 1은 어셈블리 언어의 특정 특성을 문서화합니다. 그런 다음 다른 하드웨어에서 코드를 실행하려고 시도한 사람이 없기를 바랍니다.

코드의 첫 번째 청크에서 상수 값 3 인 "$ 3"을 출력 바인딩 레지스터 "% 0"에 할당합니다. 그런 다음 출력 바인딩 된 레지스터 "% 0"에 상수 2 "$ 2"비트만큼 롤을 수행합니다.

효과적으로 4.

코드의 어느 블록이 실제로 가변 other_var의 원래 값을 판독하여 3 승산.

m은 메모리 용이고, r은 레지스터 용입니다. =는 출력이고, no =는 입력으로 사용됩니다.

mov %1, %0; load the register used for output with the value of the register used for input.. 
roll $2, %0; Then roll the output register 

그냥 레지스터를 잡고 기존의 비트 패턴은 당신이 가능성이 "쓰레기"를 닮은 무언가를 보게 될이 발견 사용하기 시작 .. 그래서 기본적으로 http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html

+0

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5 는 C 변수는 거의 항상 메모리에 있으며 수동으로로드해야합니다. 그게 맞습니까? 귀하의 코드에서 % 1은 "r"(other_val)입니까? other_val이 % 0으로 표시되었다고 생각했습니다. 그래서 % 0은 내 예제에서 other_val에 해당하는 출력 레지스터이고 % 1은 other_val과 동일한 입력 레지스터입니다. –

+0

'djgpp '란 무엇입니까? 답변을 작성하는 데 필요한 문서를 언급했지만 답변이없는 것으로 보입니다. (필자는 GCC 인라인 asm에 대한 적절한 문서를 본 적이 없다고 생각합니다. 존재하지는 않습니다.) – Potatoswatter

+0

인라인 asm을 어떻게 배웠습니까? : D –