2017-11-27 25 views
0

인라인 암 어셈블리에서 C로 선언 된 지역 변수에 액세스하려고합니다. 어떻게해야합니까?암 인라인 어셈블리에서 로컬 C 변수에 액세스하려면 어떻게해야합니까?

글로벌 변수는 다음과 같이

int temp = 0; 
Function(){ 
    __asm(
     ".global temp\n\t"   
     "LDR R2, =temp\n\t"              
     "LDR R2, [R2, #0]\n\t" 
    ); 
}  

를 액세스 할 수 있습니다하지만 어떻게 로컬 변수를 액세스합니까? 로컬 변수에 대해 ".local"을 ".local"으로 변경하려고 시도했지만 오류 ('temp'에 대한 정의되지 않은 참조)가 발생했습니다. 사용중인 IDE는 KEIL입니다.

의견이 있으십니까? 미리 감사드립니다.

+2

로컬 변수는 스택 또는 레지스터에 있습니다. 그것은 일종의 컴파일러 지원 없이는 그들을 옮기는 것이 어려울 것입니다. GCC 인라인 어셈블러는 레지스터에 등록합니다. 제 생각에 [Keil은 GCC에 기반을두고 있습니다] (http://www2.keil.com/mdk5/compiler/6/). '.local'은 정적 링크가있는 '전역'을 의미합니다. 'void foo (void) {static int bar;}'를 선언하면이 방법으로 bar에 접근 할 수 있습니다. 그러나 이는 'C'프로그래머에게는 '지역'의 일반적인 개념이 아닙니다. 그것은 '정적'입니다. –

답변

3

는 GCC의 문서에 따르면 6.45.2.3 Output Operands

당신은 그들과 같이 값 전달할 수

당신은 ASM 당신은 넣어 코드 후
#include <stdio.h> 

int main(int argc, char *argv[]) { 

    int src = 1; 
    int dst; 

    asm ("mov %1, %0\n\t add $1, %0" : "=r" (dst) : "r" (src)); 

    printf("0x%X\n", dst); 

    return 0; 
} 

':'문자와이 같은 전달할 값 : "(= | +) (r | m) 변수는 값을 무시할 때 'use'= '를 사용하고 값을 읽거나 무시할 때'+ '를 사용하고 값이 레지스터에 있으면'r ' 메모리 내에있는 경우 'm'입니다.

+0

그것은 AT & T 문법 ('add src, dst')을 가진 x86입니다. 그렇지만 확장 된 ASM과 제약 조건은 정답입니다. 그러나 인라인 asm에'mov '를 포함해서는 안됩니다. 제약 조건을 항상 사용하고 컴파일러가 'src'의 이전 값을 저장하려면 'mov'를 생성하도록합니다. 예 : 'asm ("inc % 0": "= r"(dst) : "0"(src)); '그래서'% 0'은 src로 시작하여 dst (일치 제약 조건)로 끝납니다. 물론 모든 경우에 대해 최적의 코드를 얻을 수는 없습니다. 컴파일러가'lea 1 (% rax), % esi'를 복사하여 추가하지 못하게합니다. https://gcc.gnu.org/wiki/DontUseInlineAsm –