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