2010-12-14 4 views
2

4096 (메모리 페이지의 주소와 일치하는) 변수의 주소를 가져오고 싶습니다. 는 x86 어셈블러 결과에서이 파일을 컴파일하려고Gnu AS 표현식에서 '&'연산자를 사용할 수 없습니다.

.data 
    v:  .zero 0x100 
    vpage: .long v & 0xfffff000 

: 이것은 내가 (V 변수이며 vpage이 페이지의 주소를 포함한다)이 보이는 짓을 오프라인으로 계산 될 수있는 일을하기 때문에 다음과 같은 오류 :

test.S: Assembler messages: 
test.S:3: Error: invalid sections for operation on `v' and `L0' 

왜 가스가 거부 할

이를 계산하기 위해? 이제 이상한 부분 : '&'을 "+"로 바꾸면 코드가 컴파일되고 주소가 링크 후에 올바르게 계산됩니다. 이 행동의 이유에 대한 힌트 또는 그것을 고치는 방법은 매우 환영 할 것입니다.

+0

가스는 일반적으로 백엔드 어셈블러로 사용됩니다. 컴파일러는 이미 모든 상수 표현식을 평가할 것입니다. –

+0

@Marco이 경우 NASM 또는 YASM으로 전환하는 것이 최선이라고 생각합니다. – Gnurou

+0

중요하지 않은 금액의 경우 : 예. 또는 컴파일러 인라인 어셈블러를 사용하고 컴파일러에서 수정하도록하십시오. –

답변

6

이 문제는 GAS가 링커에서 처리 할 개체 파일을 생성한다는 점에서 문제가 있습니다. GAS는 비트 AND 연산을 지원하지만 절대 주소로는 수행 할 수 없습니다. 이들은 링커에 의해 변경 될 수 있으므로 GAS는 제한된 작업 만 지원하는 재배치 항목을 생성해야합니다 (주로 오프셋). 절대 주소를 (로컬) 상대 주소로 변환 할 수있는 경우 GAS는 어셈블리 시간 동안이를 계산할 수 있습니다. 그렇지 않으면 런타임에 코드에서 수행해야합니다.

+0

좋은 답변입니다. 이 문제는 as 대신에 gcc를 호출하고 C 프리 프로세서를 사용하여 문제를 해결하기 쉽지만이 동작의 이유를 이해할 수 있습니다. 감사! – Gnurou

0

인텔 문법에서는이 작업을 수행 할 _AND, _OR, _NOT, _SHL, _SHR 어쩌면 다른 사람을 사용할 수 있습니다. 이것은 GNU의 어셈블러에서도 잘 작동 할 것입니다.

+0

GAS는이를 인식하지 못합니다. – Gnurou

관련 문제