2017-05-20 6 views
0

예를 들어, TAC add c a b (의미는 c := a + b)을 x86 어셈블리로 변환하려고합니다. 단순화를 위해, a, b, c은 모든 레지스터입니다. 그러나 x86은 ADD a ba += b을 의미합니다.TAC를 x86-64 어셈블리로 변환하는 좋은 방법이 있습니까?

내 생각은 0c에, 다음 ADD c aADD c b을 첫번째 움직임이다. 그러나 하나의 TAC를 3 개의 어셈블리 문으로 변환하는 반면 MIPS에서는 한 줄만 필요합니다. add c a b.

더 좋은 방법이 있습니까?

+2

'lea c, [a + b]'를 사용하십시오. 그러나 x86에서 가장 짧은 코드가 반드시 가장 빠를 필요는 없음을 기억하십시오. 물론, 물론'mov c, a; c, b'를 추가하면 3 개의 명령어가 필요하지 않습니다. 추신 :'lea'는 플래그를 설정하지 않으므로 필요한 경우 사용하지 마십시오. – Jester

답변

0

예, TAC에서 먼저 수정하십시오. 이 속으로

xor c a b 

:

copy c a 
xor c c b 

당신이 설명 된 바와 같이 기본적으로이다 :

내가 알고있는 두 가지 방법이있다

은, 첫 번째는 다음과 같이 재 작성 모든 것을 간단합니다 내 생각은 먼저 0에서 c로 이동 한 다음 ca를 추가하고 cb를 추가하십시오.

하지만 TAC 수준에서 복사하면 0/추가, 0/추가 이상한입니다.

이제 레지스터 할당자를 실행하면 모든 2 피연산자 제약 조건이 자동으로 충족됩니다. 물론 모든 자체 복사는 0 명령어로 끝나며 레지스터 할당자가 복사본의 가상 레지스터를 병합하려고 시도하여 정렬을 선호하도록 할 수 있습니다. 사본의 대부분은 피해야합니다.

다른 방법은 기본적으로 동일한 작업을 수행하는 것입니다. 그러나 레지스터 할당자가 처음 실행될 때 병합에 실패한 후 지연 복사본을 삽입하십시오. 레지스터 할당자가 작동하는 방식에 따라 약간의 트레이드 오프가 있습니다. TAC 크기가 거의 두 배가되는 것을 방지하고 (명령 선택에 의존하여 대부분의 복사본을 무시함) 레지스터 할당자를 두 번 실행합니다. 속도가 느리거나 빠를 지 여부는 주로 레지스터 할당자가 어떻게 작동하는지에 달려 있습니다.

2 피연산자 제약 조건이있는 작업의 원본 및 대상을 병합하고 실패 할 경우이를 받아 들인 다음 제한 조건이 충족되었는지 또는 명령 선택자가 서로 다른 경우를 암시 적으로 시도하여 암시 적으로 처리 할 수 ​​있습니다. 아니. 이는 기본적으로 복잡성을 인스트럭션 셀렉터로 밀어 넣습니다. 이는 이미 충분히 좋지 않으므로 그렇게하지 않는 편이 좋습니다. add는 86, lea에 3 피연산자 버전을 가지고 있기 때문에

나는 xor에 작업을 변경 한 - 당신은 물론 여전히 복사/우선적으로-병합 일을 할 수있는 경우에 플래그가 필요하지 않는 한.