среда, 18 марта 2015 г.

Yuri Panchul's Digital Design and Computer Architecture test

Случайно обнаружил тест от Панчула. В этом тесте есть вопросы, касающиеся архитектуры MIPS: вопросы с номерами 4, 8, 9, 10. Я дал на них следующие ответы:
4  - d
8  - c
9  - e
10 - d

Short review of Britton's book

Закончил работу с книгой Britton'а MIPS Assembly Language Programming. Хочу поделиться впечатлениями от этой книги.
Большой плюс книги - наличие большого кол-ва упражнений по каждой теме.
В книге объясняется работа с симулятором Spim (правда, старой версии от 2003г).
Важно отметить, что на протяжении 8 первых глав предполагается, что идёт работа с процессором Simple Model.
Только в 9-ой главе вводится понятие конвейера и связанных с ним "подводных камней" (hazards).
Я делал упражнения в симуляторе MARS (почему, писал в одном из постов), но упражнения из 9 главы делал с помощью QtSpim, т.к. MARS не поддерживает конвейер.
Мне показалось, что в книге плохо представлен теоретический материал. Особенно по теме стека и подпрограмм.

воскресенье, 15 марта 2015 г.

Right shifting instruction in MIPS

В наборе инструкций MIPS32 имеются две инструкции для битового сдвига вправо: 1) sra - арифметический сдвиг; 2) srl - логический сдвиг.
При арифметическом сдвиге знак числа распространяется.
При описании операции >> в книгах по языку программирования Си указывается, что для чисел без знака будет использоваться логический сдвиг, а для чисел со знаком используемая операция зависит от реализации (в частности, от процессорной архитектуры, в которую транслируется код; есть ли там команда арифметического сдвига).

Написал маленькую тестовую программу на Си для проверки действий на процессорных архитектурах x86 и MIPS:
#include <stdio.h>
#include <inttypes.h>

int main ()
{
    int32_t val;
   
    val = 0x80000000;
   
    val = val >> 31;
   
    if (val == -1)  // -1 = 0xFFFFFFFF
      printf ("Arithetic shifting is used for right shifting\n");
    else
      printf ("Logical shifting is used for right shifting\n");
   
    return 0;
}


В двух вариантах архитектуры программа показала использование арифметического сдвига.

Solving of exercise 8.2 in Britton's book

В книге Britton от 2002 года в главе 8 есть упражнение 8.2:
"Write a function MUL32 (m, n, p, f) that will find the 32-bit product “p” of two arguments m and n. If the two’s complement representation of the product cannot be represented with 32 bits, then the error flag “f” should be set to 1 otherwise the error flag is set to 0. Pass all arguments on the stack."

Чтобы выполнить проверку на то, что за предеды 32 бит не выходит результат умножения, нужно использовать код псевдоинструкции mulo. И доработать этот код для установки флага f.

Посмотреть расшифровку псевдоинструкции mulo можно либо сделав тестовую программку в симуляторе MARS, либо посмотрев исходный код на слайде 15 учебных материалов.

понедельник, 9 марта 2015 г.

UART on GCW0

Сегодня проверил UART как описано в статье.
Всё получилось без проблем. Ниже несколько фотографий:





воскресенье, 8 марта 2015 г.

YAMON on Qemu

Попробовал сегодня запустить сборку монитора загрузки YAMON.
Сделал это для платформы Malta MIPS.
Для запуска выполнил следующую команду:
qemu-system-mipsel -M malta -nographic -bios yamon-02.22.bin
Результаты выполнения команды info представлены далее.

 
YAMON ROM Monitor, Revision 02.22.
Copyright (c) 1999-2007 MIPS Technologies, Inc. - All Rights Reserved.

For a list of available commands, type 'help'.

Compilation time =              May 24 2013  12:16:34 (pburton)
Board type/revision =           0x02 (Malta) / 0x00
Core board type/revision =      0x01 (CoreLV) / 0x00
System controller/revision =    Galileo / GT_64120A-B-0
FPGA revision =                 0x0000
MAC address =                   ff.ff.ff.ff.ff.ff
Board S/N =                     0123456789
PCI bus frequency =             33.33 MHz
Processor Company ID/options =  0x01 (MIPS Technologies, Inc.) / 0x00
Processor ID/revision =         0x93 (MIPS 24Kf) / 0x00
Endianness =                    Little
CPU/Bus frequency =             200 MHz / 419 MHz
Coherency =                     None
Flash memory size =             4 MByte
SDRAM size =                    128 MByte
First free SDRAM address =      0x800c32f0

Обнаружил в YAMON команду cp0. Она выводит содержимое регистров Coprocessor 0. Эта интересная команда. Результат её выполнения далее.

BadVAddr  = 0x00000000  CacheErr  = 0x00000000
Cause     = 0x40808000  Compare   = 0x00000000
Config    = 0x80000483  Config1   = 0x9e190c8f
Config2   = 0x80000000  Config3   = 0x00000000
Config7   = 0x00000000  Context   = 0x00000000
Count     = 0xe1497eb2  DDataLo   = 0x00000000
Debug     = 0x02008000  DEPC      = 0x00000000
DESAVE    = 0x00000000  DTagLo    = 0x00000000
EBase     = 0x80000000  EntryHi   = 0x00000000
EntryLo0  = 0x00000000  EntryLo1  = 0x00000000
EPC       = 0x80046458  ErrCtl    = 0x00000000
ErrorEPC  = 0x00000000  HWREna    = 0x00000000
IDataHi   = 0x00000000  IDataLo   = 0x00000000
Index     = 0x00000000  IntCtl    = 0xe0000000
ITagLo    = 0x00000000  L23DataHi = 0x00000000
L23DataLo = 0x00000000  L23TagLo  = 0x00000000
PageMask  = 0x00000000  PRId      = 0x00019300
Random    = 0x0000000d  SRSCtl    = 0x00000000
Status    = 0x24002c01  WatchHi0  = 0x00000000
WatchLo0  = 0x00000000  Wired     = 0x00000000