Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3222

.pdf
Скачиваний:
5
Добавлен:
15.11.2022
Размер:
3.54 Mб
Скачать

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

Другие инструкции syscall

Довольно важная инструкция в MIPS ассемблере, которая использует системные вызовы операционной системы. Прежде чем использовать ее, нужно загрузить в регистр $v0 один из служебных кодов от 1 до 16 . Список кодов и соответствующих действий операционной системы:

1 — вывести на экран натуральное число, которое находится в регистре $a0.

2 — вывести на экран число с плавающей точкой, которое находится в регистре $f12.

3 — вывести на экран число с плавающей точкой

(двойная точность), которое находится в регистре $f12.

4 — вывести строку , которая находится в регистре $a0 (с нулевым символом).

5 — считать натуральное число и занести его в регистр

$v0.

6 — считать число с плавающей точкой и занести его в регистр $f0.

7 — считать число с плавающей точкой (двойная точность) и занести его в регистр $f0.

8 — считать строку, $a0 — адрес строкового буфера , $a1 — сколько символов нужно считать.

9 — ?

10 — выйти из программы.

11 — вывести символ в $a0.

12 — считать символ и занести его в $a0.

13 — открыть файл, $a0 — адрес нуль-строки, содержащей имя файла, $a1 — флаг, $a2 — режим. После операции $v0 будет содержать дескриптор файла.

14 — читать из файла, $a0 — дескриптор, $a1 — адрес входного буфера, $a2 — сколько символов прочитать. После операции $v0 будет содержать количество прочитанных символов.

106

15 — писать в файл, $a0 — дескриптор, $a1 — адрес выходного буфера, $a3 — сколько символов записать. После операции $v0 будет содержать количество записанных символов.

16 — закрыть файл, дескриптор находится в $a0.

Вменю выберите “Run…Assemble”. Окно “MarsMessages” в

нижней части экрана будет указано, если возникли какие-то ошибки. Ошибок не должно произойти.

Рис.3.2. Сообщения об ошибках

3. Моделирование

В меню выберите “Run…Go”, чтобы выполнить программу. Программа выполнит отображение двух строк текста и трех итераций цикла в окне Run I/O.

107

Рис.3.3. Запуск программы

Кнопки в верхней части окна можно использовать в качестве ярлыков для меню запуска. Используйте кнопку “Reset” для сброса программы, а затем попробовать трассировку через программу, нажав кнопку шаг.

Вы можете отрегулировать скорость выполнения программы, перемещая ползунок справа от кнопки. Если у вас есть бесконечный цикл в вашей программе, это может быть необходимо изменить (замедлить) скорость тренажера для предотвращения программа "Mars" от сбоев.

Основные управляющие элементы эмулятора MARS представлены в табл. 3.1.

108

Таблица 3.1 Основные управляющие элементы эмулятора MARS

Запустите программу. Если точка останова была установлена программа остановится на следующей точке останова.

Включить трассировку (пошаговую). Выполняет одну инструкцию. Если инструкция является вызовом процедуры (jal) тренажер останавливается на первой инструкции процедуры.

Backstep. Отменить последний шаг в код

Пауза в данный момент запущена программа. Нажмите кнопку выполнить, чтобы продолжать выполнение.

Остановить запущенные программы. Вам нужно сбросить тренажер для повторного выполнения программы после остановки его.

Сброс. Сбрасывает симулятор, повторная инициализация регистров, программного счетчика, памяти.

Регулирует скорость работы тренажера

109

3.2. Задания и упражнения

3.2.1. Приведите три примера из архитектуры MIPS для каждого из принципов хорошей разработки: (1) для простоты придерживайтесь единообразия, (2) типичный сценарий должен быть быстрым, (3) чем меньше, тем быстрее, (4) хорошая разработка требует хороших компромиссов. Поясните, как каждый из ваших примеров иллюстрирует соответствующий принцип.

3.2.2.Архитектура MIPS содержит набор 32-битных регистров. Можно ли создать компьютерную архитектуру без регистров? Если можно, кратко опишите такую архитектуру и её систему команд. Каковы преимущества и недостатки будут у этой архитектуры по сравнению с архитектурой MIPS?

3.2.3. Представьте себе 32-битное слово, хранящееся в адресуемой побайтово памяти и имеющее порядковый номер 42.

a)Каков байтовый адрес у слова памяти с порядковым номером 42?

b)Каковы все байтовые адреса, занимаемые этим словом памяти?

c)Предположим, что в этом слове хранится значение 0xFF223344. Изобразите графически, как это число хранится в байтах слова в случаях прямого и обратного порядка следова-

ния байтов. Отметьте байтовые адреса всех байтов данных.

3.2.4.Повторите упражнение 3.2.3. для 32-битного слова, имеющего порядковый номер 15 в памяти.

3.2.5.Объясните, как использовать следующую программу, чтобы определить, является ли порядок следования байтов прямым или обратным:

li $t0, 0xABCD9876

sw $t0, 100($0) lb $s5, 101($0)

3.2.6. Используя кодировку ASCII, запишите следующие строки в виде последовательностей шестнадцатеричных значе-

110

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]