2010년 10월 4일 월요일

arm inline assembly using gcc

__arm__ __volatile__ ( asms : output : input : clubber );
__arm__ __volatile__ ( asms : output : input );
__arm__ __volatile__ ( asms : output : : clubber );

* asms내의 모든 명령어는 " "사이에 있어야 한다.
* asms내의 명령어 간의 구분은 ;이나 \n으로 구분한다.
* output에서 시작해 input으로 오퍼랜드가 %0, %1, ...등등으로 매겨진다.
* ouput, input 변수들은 constraints와 변수명이 쉼표로 구분되어 있다.
- "=" : 오퍼랜드가 쓰기 전용
- "r" : 일반 레지스터 사용 오퍼랜드
- "&" : earlyclobber 오퍼랜드를 나타내고 input오퍼랜드를 사용하는 명령이 끝나기 전에 변경된다는 것을 의미한다. 그래서 input오퍼랜드나 메모리 어드레스의 일부를 나타내는 레지스터엔 못쓴다. gcc는 input변수가 다 사용되고 나면 output에 사용된다고 가정하기 때문에 input에 사용된 변수가 output과 같게 되고 또 output이 input보다 먼저 사용되는 경우가 발생할 수 있다. 이런 경우를 막기 위해 output에 사용된 변수가 input이 모두 사용되기 전에 변경될 수도 있다고 알려줘야만 input과 output이 같아져 생기는 에러를 막을 수 있다.

댓글 없음:

댓글 쓰기