수색…


비고

이 섹션은 mips가 무엇인지, 왜 개발자가 그것을 사용하고 싶어하는지에 대한 개요를 제공합니다.

또한 mips 내의 큰 주제를 언급하고 관련 주제에 링크해야합니다. mips 용 문서는 새로운 기능이므로 관련 주제의 초기 버전을 만들어야 할 수도 있습니다.

설치 또는 설정

밉 설치 또는 설치에 대한 자세한 지침.

Windows 용 QtSpim

  1. 여기 에서 QtSpim을 다운로드 하십시오. 32.6 MB
  2. 쉬운 설치 방법
  3. 첫 번째 어셈블리 파일 (.s)을 만들거나 C : \ Program Files (x86) \ QtSpim \ helloworld.s 샘플을 사용하십시오 .
  4. 바탕 화면 바로 가기 또는 C : \ Program Files (x86) \ QtSpim \ QtSpim.exe 에서 프로그램을 실행하십시오 .

프로그램을위한 두 개의 창이 있습니다. QtSpim이라는 라벨이 붙은 주 윈도우는 여기에서 실행중인 프로그램 (텍스트 레이블), 메모리 (데이터 레이블), 레지스터 값 (부동 소수점에 대한 FP Regs 및 정수에 대한 Int Regs 레이블) 시뮬레이터 제어

console이라는 레이블이 붙은 다른 창은 출력을 볼 수있는 곳으로, 프로그램이있을 경우 입력을 입력합니다.

  1. 파일 -> 파일로드를 사용하여 파일로드
  2. 클릭 실행 (f5)을 사용하여 최종 결과를 확인하거나 단계별로 이동하여 (p10) 디버그를 위해 프로그램을 실행하는 동안 레지스터 및 메모리의 상태를 볼 수 있습니다

MARS MIPS 시뮬레이터

MARS MIPS 시뮬레이터는 Missouri State University ( src )의 Pete Sanderson과 Kenneth Vollmar가 개발 한 MIPS 프로세서 용 어셈블리 언어 편집기, 어셈블러, 시뮬레이터 및 디버거입니다.

당신은 여기서 MARS를 무료로 얻습니다. 4.5 버전을 설치하는 경우 여기 에서 시스템에 적합한 Java SDK가 필요할 수 있습니다

조립하기 전에,이 시뮬레이터의 환경 simplisticly 3 개 개의 세그먼트로 분할 할 수 있습니다은 "CPU"를 나타내는 모든 코드가 작성되는 왼쪽 상단에있는 편집기, 오른쪽 편집기 아래 컴파일러 / 출력 레지스터의 목록 우리 프로그램에. 여기에 이미지 설명을 입력하십시오.

조립 후 (F3 키를 누름으로써) 환경이 바뀌고 두 개의 새로운 세그먼트가 편집기의 위치를 ​​얻습니다 : 텍스트 세그먼트

i) 어셈블리 코드의 각 라인은 "기본"열에서 "pseudoinstructions"(초 단위로 이야기 할 것입니다)와

ii) "코드"열에서 각 명령어의 기계 코드,

리틀 엔디안 순서 의 프로세서 메모리 표현을 볼 수있는 데이터 세그먼트 . 여기에 이미지 설명을 입력하십시오.

어셈블 한 후에는 코드를 한꺼번에 (F5) 또는 단계별로 (F7) 실행하고 여러 단계를 뒤로 (F8) 뒤로 되 감을 수 있습니다. 여기에 이미지 설명을 입력하십시오.

이제 위의 예제 코드를 보면서 각 행을 설명합니다.

.text
.globl main
main:            #main function

li    $v0, 11    #11=system code for printing a character, $v0=register that gets the system code for printing as value
la    $a0, 'a'   #'a'=our example character, $a0=register that accepts the character for printing
syscall          #Call to the System to execute our instructions and print the character at the a0 register 

li $v0, 10       #11=system code for terminating, $v0=register that gets the system code for terminating (optional, but desirable)
syscall          #Call to the System to terminate the execution

MARS는 .asm 파일 형식의 파일을 수락하고 내 보냅니다.

위의 코드는 문자 하나만 출력합니다. "Hello World"는 어때? 몰라, 숫자 나 뭔가를 더하는거야? 글쎄, 우리는 그저 조금은 바꿀 수있다.

.data               #data section 
str: .asciiz "Hello world\n"  
number: .word 256
 
.text                 #code section 
.globl main 
main: 
li       $v0, 4                #system call for printing strings 
la       $a0, str              #loading our string from data section to the $a0 register
syscall  
       
la       $t0, number        #loading our number from data section to the $t0 register
lw       $s1, 0($t0)        #loading our number as a word to another register, $s1 

addi     $t2, $s1, 8         #adding our number ($s1) with 8 and leaving the sum to register $t2

sw       $t2, 0($t0)        #storing the sum of register $t2 as a word at the first place of $t0

li       $v0, 10               # system call for terminating the execution
syscall 

MARS를 통해 결과를 설명하기 전에 이러한 명령에 대해 더 자세히 설명해야합니다.

  • 시스템 호출 은 운영 체제에서 제공하는 일련의 서비스입니다. 시스템 호출을 사용하려면 $ v0 레지스터에 필요한 작업을위한 호출 코드 가 있어야합니다. 시스템 호출에 인수가 있으면 $ a0- $ a2 레지스터에 저장됩니다. 다음 은 모든 시스템 호출입니다.

  • li (즉치 적재)는 레지스터에 즉시 값을로드하는 의사 명령어입니다 (나중에 설명 하겠습니다). la (로드 주소)는 레지스터에 주소를로드하는 의사 명령어이기도합니다. li $v0, 4 와 함께 $ v0 레지스터는 4 를 값으로 가지며, la $a0, strstr 의 문자열을 $a0 레지스터에로드합니다.

  • 단어 는 (우리가 MIPS에 관해서 말한 것처럼) 32 비트 시퀀스이며, 비트 31은 최상위 비트이고 비트 0은 최하위 비트입니다.

  • lw (로드 워드)는 메모리에서 레지스터로 전송되는 반면 sw (저장 워드)은 레지스터에서 메모리로 전송됩니다. lw $s1, 0($t0) 명령을 사용하여 $s1 레지스터를로드하여 $t0 레지스터의 LSB에있는 값을 등록합니다 (여기서 0 은 단어의 오프셋, 단어의 오프셋, 즉 256 임). 여기에는 $t0 에 주소가 있고 $s1 에는 값이 있습니다. sw $t2, 0($t0) 은 정반대의 일을합니다.

  • MARS는 Little Endian을 사용합니다. 즉 단어의 LSB가 메모리의 가장 작은 바이트 주소에 저장됩니다.

  • MIPS는 바이트 주소를 사용하기 때문에 주소는 이전 주소와 다음 주소가 4 씩 다릅니다.

이전의 코드를 조합하여 메모리와 레지스터 교환 방식을 이해하고 데이터 세그먼트에서 "16 진수 값"을 비활성화 할 수 있습니다.

여기에 이미지 설명을 입력하십시오.

또는 데이터 세그먼트에서 "ASCII"를 활성화하는 것 :

여기에 이미지 설명을 입력하십시오.

이렇게 시작하십시오.

$ java -jar Mars4_5.jar

이 파일을 만들고 저장하십시오.

    .text
main:
    li    $s0,0x30
loop:
    move    $a0,$s0        # copy from s0 to a0
    
    li    $v0,11        # syscall with v0 = 11 will print out
    syscall            # one byte from a0 to the Run I/O window

    addi    $s0,$s0,3    # what happens if the constant is changed?
    
    li    $t0,0x5d
    bne    $s0,$t0,loop
    nop            # delay slot filler (just in case)

stop:    j    stop        # loop forever here
    nop            # delay slot filler (just in case)

F3 키를 눌러 조립하고 실행을 누릅니다. 이제 MIPS 코드를 컴파일하고 실행하기 시작했습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow