2017-10-14 20 views
0

GCCinline assembly을 사용하여 특정 레지스터 r0에 즉시로드해야합니다. 그러나, 나는 올바른 결과를 얻지 못하고있다.PowerPC 인라인 어셈블리 : 레지스터에 C 값로드

unsigned short value = 0x1337; 

asm volatile 
(
"li 0, %0\n\t" 
     "sc\n\t" 
     "blr" 
: /* Output registers */ 
:"r"(value) /* Input registers */ 
: /* No clobbered registers */ 
); 

컴파일 할 때, 이것은 9에서 온 않습니다

li  r0, 9 
sc 
blr 

을 준다? 대신 지정된 값 0x1337을 원했습니다. Here은 내가 본 자습서입니다.

답변

2

9는 정확히 묻는 것입니다 0x1337을 포함하는 레지스터입니다. value은 입력 레지스터입니다. 9, a.k.a. r9는 완벽하게 유효한 입력 레지스터이다. 이것은 내가 얻은 어셈블리 출력입니다.

li 9,4919 
    li 0, 9 
    sc 
    blr 

0x1337을 즉시로드하려면 그냥 대신 사용하십시오.

asm volatile (
    "li 0, 0x1337\n\t" 
    "sc\n\t" 
    "blr" 
); 

아니면, 그냥 대신 "r" 제약의 "i" 제약 조건을 사용합니다.

asm volatile (
    "li 0, %0\n\t" 
    "sc\n\t" 
    "blr" 
    : 
    : "i"(0x1337) 
); 
+0

네는, 당연히 그 간단한 해결책 – BullyWiiPlaza

+0

@BullyWiiPlaza했다 : 당신은 레지스터와 immediate 만을 혼합 할 수 없습니다, 그래서 맨손 수없는 이름을 등록 얻기 위해 GCC -mregnames''사용합니다. 또한 컴파일러에게 clobber에 대한 정보를 알려주고, 'asm goto'를 사용하여 점프하고 있음을 알리십시오. 컴파일러에게 알려주는 안전한 방법이 확실하지 않더라도 asm은'lr'에 리턴 주소가 필요하고 리턴합니다. 당신은 아마도 asm으로 전체 함수를 작성해야 할 것입니다. 왜냐하면 만약 그것이 인라인한다면 이것이 어떻게 작동하는지 보지 못하기 때문입니다. –

+0

@PeterCordes : 네, 그게 전부입니다. :) – BullyWiiPlaza