2016-10-14 1 views
0
.text 
.global main 
main:  
     addi $v0, $zero,0 
     la $t0, length 
     lw $t1, 0($t0) 
     la $t4, array 
     addi $t1, $t1, -1 
     sll $t1,$t1,2 

loop: 
     add $t3, $t4,$t1 
     lw $t2,0($t3) 
     add $v0,$v0,$t2 
     addi $t1,$t1,-4 
test: 
     slti $t9,$t1,0 
     beq $t9,$zero,loop 
     nop 
     sw $v0, 0($t0) 
.data 
length: .word 8 
array: .word 9,8,7,6,5,4,3,2 

이 코드에는 몇 개의 정적 명령어가 있는지 말해야합니다. 데이터 이전에 16 개의 명령어가 있다는 것을 알고 있습니다. .data 후에 작성된 명령어가 2 개의 명령어로 간주되어 총 18 개의 명령어를 작성하는지 궁금합니다.MIPS 어셈블리 명령어 수

+1

아니요, 지시문은 지침이 아닙니다. – Michael

+1

하지만 명령 수를 알 수 있도록 데이터 세그먼트의 기본 주소를 알아야 할 것입니다. 그 이유는 명령 수를 'la'로 변환 할 것인지 결정하기 때문입니다. – Michael

+0

그래서 길이가 어떻게 든 메모리에로드되는지, 아니면 명령으로 간주되는지 궁금합니다. 따라서이 코드를 살펴보면 16 개의 정적 명령어로 작성되었는지 확인할 수 있습니다. – SebastianC

답변

0

예.

지시어 ".data"자체는 관련 머신에 컴파일되지 않으며 소스의 다른 섹션 만 표시합니다. 일부 툴체인은 다른 링크 단계에서 컴파일 된 소스의 해당 부분을 링크하도록 유도하므로 특정 실행 파일에 착륙 할 수 있습니다 부분 (실행 파일의 헤더에 표시됨, 대상 플랫폼 실행 파일 형식에 따라 다름) 워드 크기의 수치 값 9, 8로 컴파일 할

그리고 그 .word 9,8,7,6,5,4,3,2는 ...

그러나 메모리에보기 번호의 CPU 지점에서

지침만큼 좋은, 그래서 당신은 그것을 실행하려고 것 CPU는 행복하게 뛰어 다니고 지시 사항 (쓰레기 의미, 아마도 기계 충돌)으로 그 번호를 실행합니다. IIRC MIPS는 고정 된 명령어 크기에서 한 단어로 risc와 유사하므로 라인 .word 9,8,7,6,5,4,3,2에는 8 개의 명령어가 포함되어 있습니다.

을 몇 번이나 실행했는지 알려 주셔야합니다. 그리고 그것은 코드의 실행 흐름에 달려 있습니다. 루프가 끝날 때까지 코드는 매우 간단하고 직선적으로 보입니다 (루프 당 여러 번 또는 한 번만 명령을 계산해야합니까?).

여기에 sw $v0, 0($t0)으로 끝납니다. 그게 상점 단어 야? 따라서 CPU는 다음 명령어 (메모리의 다음 워드 값)를 따릅니다. 무엇이 소스에 정의되어 있지 않다면, .data 세그먼트가 시작되면 단어 8, 9, 8, ...이 지침으로 실행됩니다 (너무 분해되어서 무엇이 바뀔지).

인간이 읽을 수있는 소스는 합리적으로 16 개이며 코드가 미완성 인 것처럼 HW에서 실행하는 것을 두려워합니다.

그리고 ... 어디에서 16 가지 지침을 계산 했습니까? 나는 14 명만 본다고?


마이클이 직접 값에 따라 여러 가지 연산 코드가 여러 opcode로 어셈블 될 수 있다고 지적했기 때문에 아마도 분해를 확인하는 것이 더 쉬울 것입니다.

+0

_ "14가 표시됩니다"_'la'는 의사 명령어이며 반드시 실제 명령어로 해석 할 필요는 없습니다. – Michael

+0

la는 lui 및 ori로 번역됩니다 – SebastianC

+0

실제 질문은 원본 게시물에 표시되어 있으며,이 코드 16 또는 18에 몇 개의 정적 명령어가 있습니까? lenght : 단어 8과 배열 : .word 9, x1, x2 ... xn이 명령어인지 아닌지를 알 수 없기 때문에. – SebastianC