일부 인라인 어셈블리를 탐구하려고합니다. 흥미로운 부분이지만 문서가 부족하고 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"옵션이 필요합니다. 왜 그런가요? 내가 누락 된 정보는 무엇입니까?
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과 동일한 입력 레지스터입니다. –
'djgpp '란 무엇입니까? 답변을 작성하는 데 필요한 문서를 언급했지만 답변이없는 것으로 보입니다. (필자는 GCC 인라인 asm에 대한 적절한 문서를 본 적이 없다고 생각합니다. 존재하지는 않습니다.) – Potatoswatter
인라인 asm을 어떻게 배웠습니까? : D –