Регистры и модель памяти

Копипаста базовой лекция на Moodle

Вступление: понятие о конвенциях

Регистры

Регистр

Программное имя

Регистр

Программное имя

r0

zero

r16

s0

r1

at

r17

s1

r2

v0

r18

s2

r3

v1

r19

s3

r4

a0

r20

s4

r5

a1

r21

s5

r6

a2

r22

s6

r7

a3

r23

s7

r8

t0

r24

t8

r9

t1

r25

t9

r10

t2

r26

k0

r11

t3

r27

k1

r12

t4

r28

gp

r13

t5

r29

sp

r14

t6

r30

s8, fp

r15

t7

r31

ra

Ещё два регистра — HI и LO — используются в командах деления и умножения

Плоская модель памяти

0xffffffff

highest address in kernel (and memory)

Память устройств

Последний адрес, доступный ядру

0xffffffff

memory map limit address

Конец памяти устройств

0xffff0000

MMIO base address

Начало памяти устройств

0xfffeffff

kernel data segment limit address

Область данных ядра

Конец данных ядра

0x90000000

.kdata base address

Начало данных ядра

0x8ffffffc

kernel text limit address

Область кода ядра

Предел кода ядра

0x80000180

exception handler address

Обработчик прерываний

0x80000000

.ktext base address

Начало кода ядра

0x80000000

lowest address in kernel space

Начало памяти ядра

0x7fffffff

highest address in user space

Область данных

Последняя ячейка, доступная пользователю

data segment limit address

Последняя ячейка области данных

0x7ffffffc

stack base address

Адрес исчерпания стека

0x7fffeffc

stack pointer $sp

Сюда указывает регистр стека (растёт вниз)

0x10040000

stack limit address

Стек может расти досюда

heap base address

Начало кучи (растёт вверх)

0x10010000

.data base Address

Начало статических данных

0x10008000

Global Pointer $gp)

Сюда указывает регистр глобальных данных

0x10000000

.extern Base Address

Область глобальных данных

Data Segment base address

Начало области данных

0x0ffffffc

text limit address

Область программного кода

Последняя ячейка области программного кода

0x00400000

.text Base Address

Начало программы

0x00000000

Зарезервированная область

Задание: проверить, можно ли в MARS прочитать байт из раздела .text по нечётному адресу? (Почему :) ?)

Директивы размещения данных в памяти

В программе на языке ассемблера возникает необходимость описать содержимое сегмента памяти. Для этого код программы помечается .text, а данные — .data . При трансляции в MARS код размещается с адреса 0x400000 (если не сказано иное), а данные — с адреса 0x10010000 (опять-таки, если не сказано иное).

Адресация в секции кода

Размер ячейки команды в MIPS всегда 4 байта, поэтому

К практике

Д/З

  1. Всем, кто ещё не успел, зарегистрироваться на EJudge и решить задачку с прошлой лекции !

    • TODO задачи на EJudge:

  2. EJudge: DigitSum 'Сумма цифр'

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

    Input:

    -12345
    Output:

    15
  3. EJudge: PlusMinus 'Плюс-минус'

    Ввести натуральное N, затем N целых чисел ai; посчитать формулу a0-a1+a2-…±aN-1 . Вывести результат.

    Input:

    4
    22
    13
    14
    15
    Output:

    8
  4. EJudge: EvenBack 'Чётные назад'

    Ввести целое N, затем N целых чисел. Вывести из этих чисел только чётные, причём в обратном порядке (стеком пользоваться запрещается :) )

    Input:

    6
    12
    -11
    3
    88
    0
    1
    Output:

    0
    88
    12
  5. EJudge: NoDups 'Без повторений'

    Ввести целое N, затем N целых чисел. Вывести эти числа, пропуская уже выведенные, если встретятся повторы.

    Input:

    8
    12
    34
    -12
    23
    12
    -12
    56
    9
    Output:

    12
    34
    -12
    23
    56
    9