Поиск…


замечания

В этом разделе представлен обзор того, что такое mips, и почему разработчик может захотеть его использовать.

Следует также упомянуть о каких-либо крупных предметах в пределах mips, и ссылаться на связанные темы. Поскольку документация для mips новая, вам может потребоваться создать начальные версии этих связанных тем.

Установка или настройка

Подробные инструкции по настройке или установке mips.

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 для целого) и управление имитатором

другое окно с меткой консоли - это то, где вы увидите вывод и введите ввод своей программы, если есть какие-либо

  1. загрузите файл, используя File -> Load File
  2. вы можете использовать прогон щелчка (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.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow