저는 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 구문을 사용하여 어떻게 수행합니까? 변수 할당을 수행하는 가장 간단한 방법을 찾고 있습니다. 나는 내 어셈블러와 컴파일러에 각각 as
과 ld
을 사용하고있다.
http://compilers.iecc.com/crenshaw/tutor3.txt
당신이 PC 상대 주소 지정을 사용하도록해야합니까 : 당신이 더 밀접하게 원래의 코드를 모방하려는 경우 ,이 같은
LEA
를 사용할 수 있습니까? 그렇지 않다면,''movl % eax, + Name'이 (Crenshaw의 책을 읽지 않고) 할 것입니다. – Michael