2014-09-05 9 views
0

저는 Jack Crenshaw의 "Let 's Build A Compiler"를 연구 중입니다. Motorola 680x0 명령어를 x86 GAS 구문으로 변환하고 있습니다.GAS 어셈블리의 변수 할당

변수 할당 중에 원하는 의미는 PC 상대 주소 지정을 사용하여 변수에 대한 참조를 만드는 것입니다 (적어도 Crenshaw가 수행 할 내용 임). ,

이동 X (PC), x는 변수 이름 D0

을 다음 변수에 의해 모토로라 구문으로 액세스 될 수있다. 여기

실제 절차 (파스칼) 할당을위한 모습입니다 :

procedure Assignment; 
var Name: char; 
begin 
    Name := GetName; 
    Match('='); 
    Expression; 
    EmitLn('LEA ' + Name + '(PC),A0'); 
    EmitLn('MOVE D0,(A0)') 
end; 

는 정크 표현 오류 가스 어셈블리 결과에서 동일한 구문을 모방하려고합니다. 다행히도이 질문은 그다지 순진한 것은 아니지만 지금은 며칠 동안 조사 중이며 분명한 해결책을 찾지 못했습니다.

Linux (i386)의 x86 프로세서에서 GAS 구문을 사용하여 어떻게 수행합니까? 변수 할당을 수행하는 가장 간단한 방법을 찾고 있습니다. 나는 내 어셈블러와 컴파일러에 각각 asld을 사용하고있다.

http://compilers.iecc.com/crenshaw/tutor3.txt

+1

당신이 PC 상대 주소 지정을 사용하도록해야합니까 : 당신이 더 밀접하게 원래의 코드를 모방하려는 경우 ,이 같은 LEA를 사용할 수 있습니까? 그렇지 않다면,''movl % eax, + Name'이 (Crenshaw의 책을 읽지 않고) 할 것입니다. – Michael

답변

3

x86-32는 PC 상대 주소 지정 없지만, x86-64를 수행합니다

여기 크렌쇼에서 나는, 현재 제 3 장 어딘지에 대한 링크입니다. 어떤 경우에도 x86에서는 레지스터를 거칠 필요가 없으므로 MOV에서 심볼을 직접 사용할 수 있습니다. 따라서 가장 간단한 작성 방법은 MOV source_register, variable_name입니다.

LEA variable-name, temp_register 
MOV source_register, (temp_register) 
+0

이 접근법은 변수가 먼저 선언되어야한다고 생각합니다. Crenshaw가 아무 것도 선언하지 않는 것으로 보입니다. 죄송합니다. 원래의 질문에서 그 점을 잊어 버렸습니다. –

+0

* first *로 선언 할 필요는 없지만 저장 할당을 사용하여 어딘가에 정의해야합니다. – Jester

+0

실제로, 도움이됩니다. 선언문이 인라인이거나 .data 또는 .bss 섹션에 있어야합니까? –