mips 튜토리얼
mips 시작하기
수색…
비고
이 섹션은 mips가 무엇인지, 왜 개발자가 그것을 사용하고 싶어하는지에 대한 개요를 제공합니다.
또한 mips 내의 큰 주제를 언급하고 관련 주제에 링크해야합니다. mips 용 문서는 새로운 기능이므로 관련 주제의 초기 버전을 만들어야 할 수도 있습니다.
설치 또는 설정
밉 설치 또는 설치에 대한 자세한 지침.
Windows 용 QtSpim
- 여기 에서 QtSpim을 다운로드 하십시오. 32.6 MB
- 쉬운 설치 방법
- 첫 번째 어셈블리 파일 (.s)을 만들거나 C : \ Program Files (x86) \ QtSpim \ helloworld.s 샘플을 사용하십시오 .
- 바탕 화면 바로 가기 또는 C : \ Program Files (x86) \ QtSpim \ QtSpim.exe 에서 프로그램을 실행하십시오 .
프로그램을위한 두 개의 창이 있습니다. QtSpim이라는 라벨이 붙은 주 윈도우는 여기에서 실행중인 프로그램 (텍스트 레이블), 메모리 (데이터 레이블), 레지스터 값 (부동 소수점에 대한 FP Regs 및 정수에 대한 Int Regs 레이블) 시뮬레이터 제어
console이라는 레이블이 붙은 다른 창은 출력을 볼 수있는 곳으로, 프로그램이있을 경우 입력을 입력합니다.
- 파일 -> 파일로드를 사용하여 파일로드
- 클릭 실행 (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, str
은str
의 문자열을$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 코드를 컴파일하고 실행하기 시작했습니다.