2017-09-24 13 views
0

없이 수행합니다. 어셈블러 코드를 처음 작성했습니다.

test.c: Assembler messages: 
test.c:7: Error: bad or irreducible absolute expression 
test.c:7: Error: expecting scale factor of 1, 2, 4, or 8: got `$2' 

그런 다음 나는

"leal 2(%%ebx,%%eax,$2),%1" 

"leal 2(%%ebx,%%eax,2),%1" 
을 변경 : 맨 처음 시작시 , 나는
#include<stdio.h> 
int main(){ 
    int x,y; 
    asm("movl $2,%eax"); 
    asm volatile(
        "movl $1,%0\n\t" 
        "movl %0,%%ebx\n\t" 
        "leal 2(%%ebx,%%eax,$2),%1" 
        :"=m"(x),"=r"(y) 
        ); 
    printf("x is %d, y is %d\n",x,y); 
    return 0; 
} 

gcc에

을 썼다 5.4.0 컴파일러는 오류 메시지를 제공합니다

케이. 그러나 $ 2는 2와 같지 않습니까?

+1

이 구문에서 숫자는 $가 없어야하며, 정의 된 그대로입니다. 일반적으로 $는 상수를 의미하지만 주소 지정 모드에서 특정 상수 이외의 다른 것을 가질 수 없기 때문에 접두어를 사용하지 않아 상수라고합니다. –

+1

FYI, 컴파일러에게 (clobber 제약 조건과 함께)'% ebx'를 clobbering하면 예측할 수없는 결과가 발생합니다. (글쎄, 컴파일러에서 마지막 asm 출력을'gcc -O2 -S'로 읽으면 예측할 수 있습니다.) https://stackoverflow.com/tags/inline-assembly/info를 참조하십시오. –

답변

0

T 문법에서 달러 기호 $즉치 피연산자를 나타냅니다.는 예를 들어,

add 16,%eax 

은 (eax16 추가)

add $16,%eax 

에서 (어드레스로 eax16 값에 추가) 구별한다. 이는 정수 상수와 전혀 관련이 없다는 점에 유의하십시오. foo 일부 기호입니다 당신은뿐만 아니라

add foo,%eax 

add $foo,%eax 

영장 수 있습니다. disp(base,index,scale) 표기법은 SIB 어드레싱을 사용하는 메모리 피연산자를 나타냅니다.이 어드레싱 모드의 세 부분은 각각 고정 된 목적을 가지고 있으므로, scale을 장식하는 데는 아무런 포인트가 없습니다. 결국 우리는 이미 어드레싱 모드를 선택 했으므로 괄호 안에 다른 피연산자 유형 표시기가 있어야하는 이유는 무엇입니까? 레지스터 이름 앞의 %은 매크로 또는 심볼 이름과 레지스터 이름을 구별하기 때문에 필수 항목입니다.