Материал: Архитектура и программирование MIPS-процессоров. Разинкин К.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

0x10008000 + 0xFFFF8000 = 0x10000000 – это адрес перемен-

ной f.

Этап 4: Загрузка Операционная система загружает программу, считывая сегмент

кода исполняемого файла с устройства хранения данных (обычно это жесткий диск) в сегмент кода памяти. Операционная система сначала присваивает регистру $gp значение 0x10008000, равное середине сегмента глобальных данных, затем присваивает регистру $sp значение 0x7FFFFFFC, равное верхней границе сегмента динамических данных, после чего выполняет команду jal 0x00400000 для перехода к началу программы. На рис. 2.24 показана карта памяти в начале выполнения программы.

Рис. 2.24. Исполняемый файл, загруженный в память

101

3.ПРАКТИКУМ

3.1.Эмулятор процессоров MIPS –MARS

Одним из наиболее распространённых и простых GUIэмуляторов процессоров MIPS является MARS, тоже разработанный

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

ке http://courses.missouristate.edu/KenVollmar/MARS/download.htm.

Mars является полнофункциональной средой (IDE) MIPS ассемблера, с помощью встроенного редактора, где вы можете ввести свои сборки программы и собрать их вместе в симулятор, который позволит запускать свои программы MIPS ассемблера и позволит вам отлаживать их.

Ввод обучающей программы

1.Откройте программу "Mars" и выберите в меню "File..New”. Документ будет открыт в котором вы можете ввести ваш код ассемблера в. Нажмите “File... Save As” и сохрани-

те файл как “tutorialO1.asm”.

2.Введите код, как показано ниже в редактор и сохранить

вфайл

#Program File: tutorialOl.asm

#Written by: Nate Houk

#Date Created: 1/22/08

#Description: Tutorial program to introduce MARS simulator

#including: breakpoints, single-stepping,

#and register and memory windows.

#

#

# Declare some constants

#

"Welcome to EE 109\n" "Assembly language is fun!\n" "\nLoop #"

.data stringl:

.asciiz string2:

.asciiz string3:

.asciiz

#

 

 

 

 

#

Main program body

 

 

#

 

 

 

 

.text

 

 

 

 

main:

 

 

 

 

li

$v0,

4

 

 

la

$a0,

string1

 

 

syscall

 

 

 

 

la

$a0,

string2

 

 

102

syscall

 

 

li

$t0,

1

 

loop:

 

 

 

li

$v0,

4

 

la

$a0,

string3

syscall

 

 

li

$v0,

1

 

move

$a0,

$t0

 

syscall

 

 

addi

$t0,

$t0,

1

bne

$t0,

4,

loop

#

 

 

 

#

Halt

 

 

#

 

 

 

li

$v0, 10 syscall

 

Рис. 3.1.Интерфейс MARS

Здесь необходимо уточнить некоторые директивы и ключевые выражения MIPS ассемблера.

103

Директивы

.data — хранение данных и объявление глобальных переменных.

.text — сам код программы.

.globl s — объявляет метку s глобальной.

.extern s size — объявляет, что s имеет размер size и делает s глобальным.

.align n — выравнивание всех следующих данных на

2^n байт.

.ascii str — объявляет строку str без нулевого символа.

.asciiz str — объявляет строку str с нулевым символом.

.byte / .half / .word / .dword — объявление основных ти-

пов данных.

.float / .double — объявление данных с плавающей точ-

кой.

.space n — выделить n байт.

Существует 4 основных типа данных в MIPS ассемблере, byte (8 бит), halfword (16 бит), word (32 бита) и double word (64

бита).

Формат объявления: name: type value(s)

Пример:

.data

 

 

 

array1:

.byte

 

'a','b','c'

num1:

.word

2,3,4,5,6

array2:

.space

 

9000

string:

.asciiz

"I like MIPS"

var1:

.float

 

-5.3

var2:

.double

0.3e-10

Арифметические инструкции

add $x, $a, $b — x = a+b , может вызвать переполнение.

addu $x, $a, $b — как и выше, но не вызывает переполнения.

addi $x, $a, i16 — как и add , но i16 — 16-битное целое число, может вызвать переполнение.

addiu $x, $a, i16 — как и выше, но не вызывает переполнения.

104

sub $x, $a, $b — x = a-b , может вызвать переполнение.

subu $x, $a, $b — как и выше, но не вызывает переполнения.

mult $a, $b — умножение a и b, результат записывается в регистры lo и hi.

mfhi $x — присваивает регистру x значение регистра hi.

mflo $x — присваивает регистру x значение регистра lo.

div $a, $b — деление a на b, целое записывается в lo, а остаток в hi.

divu $a, $b — как и выше, только не вызывает переполнения.

move $x, $y — присваивает x значение y.

Переходы

j target — переход на метку target.

jr $x — перейти по адресу, содержащему в регистре x.

jal target — копирует содержимое программного счетчика в регистр $ra и переходит по метке target.

Условные переходы

b target — безусловный переход на метку target.

beq $a, $b, target — перейти на метку target, если a = b.

blt $a, $b, target — перейти на метку target, если a < b.

ble $a, $b, target — перейти на метку target, если a <= b.

bgt $a, $b, target — перейти на метку target, если a > b.

bge $a, $b, target — перейти на метку target, если a >= b.

bne $a, $b, target — перейти на метку target, если a <> b.

Прямая и косвенная адресация

la — $x, var — копировать RAM адрес var (объявлено в

.data) в регистр x.

lw $x, s($y) — загрузить слово, содержащее в RAM памяти по адресу $x, в регистр $y. Можно дописать смещение от адреса в регистре (s).

li — $x, i16 — загрузить 16 или 32-битное число в регистр $x.

sw — $x, s($y) — зарезервировать машинное слово, содержащее в регистре $x, в RAM памяти по адресу $y. Можно дописать смещение (s).

105

Источник: https://studfile.net/preview/16568788/