2016-09-28 3 views
0

이것은 매우 새로운 MIPS 코더의 매우 일반적인 질문이지만 C에서 MIPS로 코드를 변환 할 때 명령 수는 구현에 따라 변경되거나 항상 동일합니까? 예를 들어 다음과 같은 방정식을 사용했습니다.구현시 MIPS 명령어 카운트가 변경됩니까?

for(i=0; i<a; i++) 
for(j=0; j<b; j++) 
D[4*j] = i+j; 

내 명령어 개수는 (4 * a) + (8 * a * b) +4입니다. 하지만 실제로 코드를 작성한 방법에 따라 변경 될 수 있습니까? 감사!

+0

"코드"란 무엇입니까? 여기서는 C 코드 (작성 방법은 중요하지만 컴파일러가 결정하는 것이 더 중요합니다) 또는 어셈블리 (분명히 다르게 쓰면 결과가 달라집니다)입니까? – harold

+0

코드에 의해, 나는 어셈블리를 의미하지만 특히 isa와 컴파일러에 의해 결정되는 명령 카운트의 정의를 언급하고 있습니다. 그리고 기본적으로 명령 수를 변경하는 방법이 있는지 IE에서 코드를 작성하는 방식이 다른지, 따라서 더 적은 수의 명령이 있거나 결국 더 많은 시간에 동일한 수의 명령을 수행 할 것인지 묻는 질문이있었습니다. – SN44

+0

가끔은 단일 명령 수준에서도 가끔 달성 할 수 있습니다. 다른 지시에 의한 동일한 결과. 값을 2로 나누는 것은 DIV 또는 오른쪽으로 비트를 이동하여 수행 할 수 있으며 값 결과는 동일합니다 (그러나 시프트는 나머지를 생성하지 않습니다). C에서 가장 큰 차이점을 보는 쉬운 방법은 "디버그"빌드 대 "최적화 된"빌드의 기계 코드를 확인하는 것입니다. 어셈블리에서 프로그래머는 더 많은 것을 제어 할 수 있습니다. 일반적으로 어셈블리가 대개 inst의 1 : 1 매핑이므로 컴파일 후에 정확히 어떤 코드가 소스 코드인지 알 수 있습니다. opnode를 기계화하기위한 니모닉 (pseudo inst. 제외). – Ped7g

답변

1

물론 무언가를하는 방법은 거의 없습니다.

루프의 경우 예를 들어 for 루프의 경우 테스트가 맨 위에 있고 무조건적인 점프 백업이 있고 "약간 더 똑똑한"폼이 맨 아래 테스트와 무조건적인 점프 "루프 전에"직접 테스트. 이것은 더 이상의 코드를 필요로하지 않는 루프 반전의 특별한 형태이지만 반복문이 0 번 반복되지 않는 한 동적으로 더 적은 수의 명령어를 실행합니다 (j은 더 이상 루프에 없으며 한 번만 발생합니다).

더 일반적으로 로컬 변수를 항상 레지스터에 유지하거나 메모리에서 다양한 시간을 소비하도록 결정할 수 있습니다 ("모든 사용 시마다로드 및 모든 할당시 저장"부터 무의미한로드 및 제거하려는 상점).

이 이야기의 "당신"은 컴파일러가 될 수도 있습니다. 그리고 여러분 (이번에는 진짜)은 보통 깃발을 달아서 얼마나 많은 명령을 내야 하는지를 조작 할 수 있습니다. 일반적으로 최적화를 전혀하지 않는다는 사실은 컴파일러가 변수를 사용할 때마다 부하를 발생시키고 모든 할당에 저장하는 반면, 0이 아닌 최적화에서는 그렇게해서는 안됩니다.