mips учебник
Начало работы с mips
Поиск…
замечания
В этом разделе представлен обзор того, что такое mips, и почему разработчик может захотеть его использовать.
Следует также упомянуть о каких-либо крупных предметах в пределах mips, и ссылаться на связанные темы. Поскольку документация для mips новая, вам может потребоваться создать начальные версии этих связанных тем.
Установка или настройка
Подробные инструкции по настройке или установке mips.
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 для целого) и управление имитатором
другое окно с меткой консоли - это то, где вы увидите вывод и введите ввод своей программы, если есть какие-либо
- загрузите файл, используя File -> Load File
- вы можете использовать прогон щелчка (f5), чтобы увидеть конечный результат или шаг за шагом (p10), чтобы просмотреть состояние регистра и памяти во время выполнения программы для отладки
Симулятор MARS MIPS
MARS MIPS simulator - это редактор языка ассемблера, ассемблер, симулятор и отладчик для процессора MIPS, разработанный Пит Сандерсон и Кеннет Фолмар из Университета штата Миссури ( src ).
Вы получаете MARS бесплатно здесь . Что касается установки версии 4.5, вам может понадобиться подходящий Java SDK для вашей системы здесь
Перед сборкой среду этого симулятора можно упрощенно разделить на три сегмента: редактор в левом верхнем углу, где записывается весь код, компилятор / выход справа под редактором и список регистров, которые представляют собой «CPU», для нашей программы.
После сборки (просто нажав F3) среда изменится, а два новых сегмента получат позицию редактора: текстовый сегмент, где
i) каждая строка кода сборки очищается от «псевдоинструкций» (мы будем говорить о них в секундах) в «базовой» колонке и
ii) машинный код для каждой команды в столбце «код»,
и сегмент данных, где мы можем взглянуть на представление памяти процессора с порядком little-endian .
После сборки мы можем выполнить наш код либо сразу (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
(load instant) - это псевдо-инструкция (об этом мы поговорим позже), которая мгновенно загружает регистр со значением.la
(адрес загрузки) также является псевдо-инструкцией, которая загружает адрес в регистр. Сli $v0, 4
регистр $ v0 теперь имеет значение4
, аla $a0, str
загружает строкуstr
в регистр$a0
.Слово (насколько мы говорим о MIPS) представляет собой 32-битную последовательность, причем бит 31 является самым значимым битом, а бит 0 является наименее значимым битом.
lw
(загрузочное слово) переносит из памяти в регистр, аsw
(запоминающее слово) передает из регистра в память. С помощью командыlw $s1, 0($t0)
мы загрузили в регистр$s1
значение, которое было в LSB регистра$t0
(это то, что символизирует здесь0
, смещение слова), или256
.$t0
здесь имеет адрес, а$s1
имеет значение.sw $t2, 0($t0)
выполняет только противоположную работу.MARS использует Little Endian , что означает, что LSB слова хранится на наименьшем байтовом адресе памяти.
MIPS использует байтовые адреса , поэтому адрес отличается от предыдущего и следующего 4.
Собирая код из ранее, мы можем дополнительно понять, как память и регистры обмениваются, отключая «шестнадцатеричные значения» из сегмента данных:
или включение «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.