Rating@Mail.ru

Форум по операционной системе GNU/Linux и свободному программному обеспечению


Текущее время: 25 апр 2018, 13:36

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 11:58 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Вот по вот этой книге (здесь можете свободно скачать): Компьютерные системы: архитектура и программирование. Взгляд программиста
Цитата:
Год: 2005
Автор: Брайант Р., О'Халларон Д.
Переводчик: Дмитрий Ежов, Станислав Шестаков
Жанр: Computer Science
Издательство: БХВ-Петербург
ISBN: 5-94157-433-9
Язык: Русский
Формат: DjVu
Качество: Отсканированные страницы
Количество страниц: 1090
Изображение

Глава 4, Архитектура процессора - там описывается подобный x86 гипотетический процессор Y86, всего с 21 командой, достаточными для написания иллюстрационных программ.

P.S. Попросили помочь ... но задача оказалась любопытная и не тривиальная...
Плюс в такой формулировке высказывалось пожелание возможности простоты и лёгкости расширения таблицы команд гипотетического процессора любыми новыми командами ... в частности, механизмом выполнения вещественных операций, floating point ...


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 12:22 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Глава 4, Архитектура процессора - там описывается подобный x86 гипотетический процессор Y86, всего с 21 командой, достаточными для написания иллюстрационных программ.

P.S. Попросили помочь ... но задача оказалась любопытная и не тривиальная...


1-я нетривиальность в том, что ... русскоязычный перевод 2005г. более чем на 1000 стр. - изобилует ошибками и неточностями при переписывании рисунков и таблиц из англоязычного оригинала, поэтому по нему воссоздать проект симулятора нельзя, нужно искать оригинал.

2-я нетривиальность в том, что задача сложная не в том, как для неё написать код, а по тому, как вы её будете её после отлаживать, проверять и откуда вы возьмёте входные данные для проверок на корректность результатов.

Ищем оригиналы от авторов... И находим оригиналы от авторов, издание 2-е, здесь на GitHub (кстати, уже с изменениями 2013г.). Здесь кроме самой книги в виде, свободном от издательских ошибок, находим и архив кодов, в котором, в частности, содержатся пример исходного кода тестовой программы для Y86 (файл *.ys) + результат её компиляции в код процессора (файл *.yo) + итог выполнения этого кода в симуляторе (файл *yis). Этого более чем достаточно для отладки и контроля. Эти файлы и приложены к сообщению.

P.S. Анализируя их авторский Makefile, приходим к заключению, что они собирают программу ассемблирования (компилятор) yas + программу исполнения кода (симулятор) yis. Для совместимости я буду следовать тем же соглашениям.


Вложения:
ex.tgz [1.58 КБ]
Скачиваний: 2
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 12:30 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Ищем оригиналы от авторов... И находим оригиналы от авторов, издание 2-е, здесь на GitHub (кстати, уже с изменениями 2013г.).

В этой редакции авторы рассматривают 32-бит процессор.
Но у них есть следующее, 3-е издание, в котором они перешли к 64-бит архитектуре, изменился формат команд, вместо регистров %eax, %ebx и т.д. фигурируют теперь %rax, %rbx и т.д.

3-е издание книги можно скачать здесь: Computer Systems: A Programmer’s Perspective, 3rd Edition
Цитата:
Название: Computer Systems: A Programmer’s Perspective, 3rd Edition
Авторы: David R. O'Hallaron, Randal E. Bryant
Издательство: Pearson
Год: 2015
Страниц: 1120
Язык: English
Формат: pdf
Размер: 36 mb


Поскольку это совершенно единообразно, я не буду отвлекаться на 64-бит реализацию, и остановлюсь на предыдущей редакции.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 16:12 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Поскольку это совершенно единообразно, я не буду отвлекаться на 64-бит реализацию, и остановлюсь на предыдущей редакции.

Сначала - компилятор с языка ассемблера (мнемокода) Y86, yas.
В отличие от авторов книги, которые совершенствуют свой курс в университете Карнеги-Мелона на протяжении 20 лет, у нас не было столько времени ... ассемблер нужно было сделать в 3-4 дня. Поэтому анализ и разбор строк исходного кода будем делать используя технику регулярных выражений в C++.
Все команды процессора сводим в единую таблицу в отдельном файле command.cc:
Код:
static struct comnd {        // общее для всех программ описание набора команд
   string      mnemo;
   int         cod, length, ops;
   string      pattern;      // регулярное выражение синтаксиса
   const void* func;
} comnds[] = {
   { "nop"   , 0x00, 1, 0,   // nop
     R"(^\s*(nop)\s*(#.*)?$)"      },
   { "halt"  , 0x10, 1, 0,   // halt
     R"(^\s*(halt)\s*(#.*)?$)"     },
   { "rrmovl", 0x20, 2, 1,   // rrmovl    rA, rB
     R"(^\s*(rrmovl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "irmovl", 0x30, 6, 2,   // irmovl    D, rB
     R"(^\s*(irmovl)\s+(\w+|\$[\+|\-]?[0-9]+|\$0x[0-9|a-f]+)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "rmmovl", 0x40, 6, 2,   // rmmovl    rA, D(rB) 
     R"(^\s*(rmmovl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*([\+|\-]?[0-9]+|0x[0-9|a-f]+)*\s*\(\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*\)\s*(#.*)?$)" },
   { "mrmovl", 0x50, 6, 2,   // mrmovl    D(rB), rA
     R"(^\s*(mrmovl)\s+([\+|\-]?[0-9]+|0x[0-9|a-f]+)*\s*\(\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*\)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "addl"  , 0x60, 2, 2,   // addl      rA, rB
     R"(^\s*(addl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "subl"  , 0x61, 2, 2,   // subl      rA, rB
     R"(^\s*(subl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "andl"  , 0x62, 2, 2,   // andl      rA, rB
     R"(^\s*(andl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "xorl"  , 0x63, 2, 2,   // xorl      rA, rB
     R"(^\s*(xorl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "jmp"   , 0x70, 5, 1,   // jmp       A
     R"(^\s*(jmp)\s+(\w+)\s*(#.*)?$)" },
   { "jle"   , 0x71, 5, 1,   // jle       A
     R"(^\s*(jle)\s+(\w+)\s*(#.*)?$)" },
   { "jl"    , 0x72, 5, 1,   // jl        A 
     R"(^\s*(jl)\s+(\w+)\s*(#.*)?$)" },
   { "je"    , 0x73, 5, 1,   // je        A
     R"(^\s*(je)\s+(\w+)\s*(#.*)?$)" },
   { "jne"   , 0x74, 5, 1,   // jne       A
     R"(^\s*(jne)\s+(\w+)\s*(#.*)?$)" },
   { "jge"   , 0x75, 5, 1,   // jge       A
     R"(^\s*(jge)\s+(\w+)\s*(#.*)?$)" },
   { "jg"    , 0x76, 5, 1,   // jg"       A
     R"(^\s*(jg)\s+(\w+)\s*(#.*)?$)" },
   { "call"  , 0x80, 5, 1,   // call      A
     R"(^\s*(call)\s+(\w+)\s*(#.*)?$)" },
   { "ret"   , 0x90, 1, 0,   // ret
     R"(^\s*(ret)\s*(#.*)?$)" },
   { "pushl" , 0xA0, 2, 1,   // pushl     ra
     R"(^\s*(pushl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" },
   { "popl"  , 0xB0, 2, 1,   // popl      ra
     R"(^\s*(popl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$)" }
};

const int ncomnd = sizeof( comnds ) / sizeof( struct comnd );

Смысл этого в следующем:
- этот файл будет include и в ассемблер yas и в симулятор yis в неизменном виде, за счёт этого при дополнении набора команд не возникнет несоответствие их версий;
- поле pattern содержит регулярное выражение разбора этой команды;
- растипизированное (void*) поле func будет в одном случае (yas.cc) содержать функцию генерации компилированного кода, а в другом (yis.cc) - ссылку на объект класса функтора выполнения (производного от абстрактного класса command, содержащего переопределённый оператор () ).


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 16:18 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Поэтому анализ и разбор строк исходного кода будем делать используя технику регулярных выражений в C++.

Подбирать и испытывать регулярные выражения, срабатывающих на требуемый синтаксис - дело тягомутное и хлопотное. Поэтому было сделано специальное приложение regs.cc, считывающие любой набор патернов (регулярных шаблонов) из отдельного файла, а потом в диалоге прогоняющем все вводимые строки на результат отождествления. Код regc.cc :
Код:
#include "common.cc"
#include <regex>

int test_table( int p, char* fname[] ) {
   while( --p ) {
      ifstream fin;
      fin.open( fname[ p ] );
      if( !fin ) break;
      fin.close();
   }
   return p;
}

vector<regex> load_table( int p, char* fname[] ) {
   vector<regex> vr;
   int n = 1;
   while( --p ) {
      ifstream fin;
      string cur;
      fin.open( fname[ p ] );
      while( true ) {             
         getline( fin, cur );
         if( fin.eof() ) break;                        // EOF
         if( '#' == cur[ 0 ] ) continue;               // комментарий
         if( !cur.length() ) continue;                 // пустая строка
         try {
            regex rc = regex( cur );
            vr.push_back( rc );
            cout << "#" << n++ << ":\t" << cur << endl;
         }
         catch( regex_error& e ) {                     // ошибка трансляции регулярного выражения
            cout << "ошибка:\t" << cur << endl;
         }
      }
      fin.close();
   }     
   cout << "-------------------------------------------" << endl;
   return vr;
}

int main( int argc, char *argv[] ) {
   if( argc < 2 ) {
       cout << "не заданы файлы щаблонов?" << endl;
       return 1;
   }
   int n = test_table( argc, argv );
   if( n ) {
      cout << "файл шаблонов не найден: " << argv[ n ] << endl;     
      return 2;
   }
   vector<regex> r = load_table( argc, argv );
   smatch m;
   while( true ) {
      cout << "> ";
      string cur;
      getline( cin, cur );
      if( cin.eof() ) {
         cout << endl;
         return 0;
      }
      if( cur == "!" || cur == "~" ) {
         r = load_table( argc, argv );
         continue;
      }
      n = 1;
      for( auto &pt : r ) {
         if( regex_match( cur, m, pt ) ) {
            cout << "#" << n << " [" << m.size() << "]: " << m[ 0 ].str() << " => " << endl;
            for( unsigned i = 1; i < m.size(); i++ )
               cout << i << ": [" << m[ i ].str() << "] <" << m.position( i ) << ":"
                    << m.length( i ) << ">" << endl;
         }
         n++;
      }
   }
}

Заголовочный включаемый файл common.h - общий для всех программ:
Код:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <typeinfo>
#include <string>
#include <vector>
#include <map>
#include <regex>
#include <unistd.h>
#include <cstdint>
using namespace std;

#define version "2.18"

extern bool little_endian;                             // тип процессора: big/litle endian
extern int debug_level;                                // уровень отладочного вывода

#define ADRLEN 2                                       // число байт в отображении адреса

ostream& operator <<( ostream& out, const vector<string>& t );
ostream& operator <<( ostream& out, const vector<int>& t );

inline regex pattern( const string& r ) {
   //   try { return regex( r ); }                     // с учётом регистра
   try { return regex( r, regex_constants::icase ); }  // без учёта регистра
   catch( regex_error& e ) {                           // ошибка записи регулярного выражения
      cerr << "синтаксис регулярного выражения:\t" << r << endl;
      exit( 3 );
   }
}


Вложения:
regs.218.tgz [2.13 КБ]
Скачиваний: 2
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 16:24 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Подбирать и испытывать регулярные выражения, срабатывающих на требуемый синтаксис - дело тягомутное и хлопотное. Поэтому было сделано специальное приложение regs.cc, считывающие любой набор патернов (регулярных шаблонов) из отдельного файла, а потом в диалоге прогоняющем все вводимые строки на результат отождествления.

Выглядит это примерно так:
Код:
[olej@dell 3]$ ./regs cmd.pat
#1:   ^\s*(nop)\s*(#.*)?$
#2:   ^\s*(halt)\s*(#.*)?$
#3:   ^\s*(rrmovl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#4:   ^\s*(irmovl)\s+(\w+|\$[\+|\-]?[0-9]+|\$0x[0-9|a-f]+)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#5:   ^\s*(rmmovl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*([\+|\-]?[0-9]+|0x[0-9|a-f]+)*\s*\(\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*\)\s*(#.*)?$
#6:   ^\s*(mrmovl)\s+([\+|\-]?[0-9]+|0x[0-9|a-f]+)*\s*\(\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*\)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#7:   ^\s*(addl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#8:   ^\s*(subl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#9:   ^\s*(andl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#10:   ^\s*(xorl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*,\s*%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#11:   ^\s*(jmp)\s+(\w+)\s*(#.*)?$
#12:   ^\s*(jle)\s+(\w+)\s*(#.*)?$
#13:   ^\s*(jl)\s+(\w+)\s*(#.*)?$
#14:   ^\s*(je)\s+(\w+)\s*(#.*)?$
#15:   ^\s*(jne)\s+(\w+)\s*(#.*)?$
#16:   ^\s*(jge)\s+(\w+)\s*(#.*)?$
#17:   ^\s*(jg)\s+(\w+)\s*(#.*)?$
#18:   ^\s*(call)\s+(\w+)\s*(#.*)?$
#19:   ^\s*(ret)\s*(#.*)?$
#20:   ^\s*(pushl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
#21:   ^\s*(popl)\s+%e(ax|cx|dx|bx|sp|bp|si|di)\s*(#.*)?$
-------------------------------------------
> mrmovl 8(%ebp), %edx
#6 [6]: mrmovl 8(%ebp), %edx =>
1: [mrmovl] <0:6>
2: [8] <7:1>
3: [bp] <11:2>
4: [dx] <18:2>
5: [] <20:0>
>

Без подобного тестера отработать синтаксис регулярных выражений практически невозможно.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 16:51 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Сначала - компилятор с языка ассемблера (мнемокода) Y86, yas.

Компиляция эталонного примера полученным компилятором yas абсолютно подобна по результату, полученному авторами книги:
Код:
[olej@dell Y86]$ ./yas -v l2
размерность таблицы команд: 21
----------------------------------------------
Done   :   0x007e
Loop   :   0x006d
Main   :   0x0028
Stack   :   0x0100
array   :   0x0014
init   :   0x0000
len2   :   0x003e
----------------------------------------------
                       | # Execution begins at address 0
  0x0000:              |    .pos 0
  0x0000: 30f400010000 | init:   irmovl Stack, %esp     # Set up stack pointer 
  0x0006: 30f500010000 |    irmovl Stack, %ebp     # Set up base pointer   
  0x000c: 8028000000   |    call Main      # Execute main program
  0x0011: 10           |    halt         # Terminate program
                       |
                       | # Array of 4 elements + terminating 0
  0x0014:              |    .align 4    
  0x0014: 0d000000     | array:   .long 0xd
  0x0018: c0000000     |    .long 0xc0
  0x001c: 000b0000     |    .long 0xb00
  0x0020: 00a00000     |    .long 0xa000
  0x0024: 00000000     |    .long 0
                       |
  0x0028: a05f         | Main:   pushl %ebp
  0x002a: 2045         |    rrmovl %esp,%ebp
  0x002c: 30f214000000 |    irmovl array,%edx
  0x0032: a02f         |    pushl %edx         # Push array
  0x0034: 803e000000   |    call len2      # len2(array)
  0x0039: 2054         |    rrmovl %ebp,%esp
  0x003b: b05f         |    popl %ebp
  0x003d: 90           |    ret
                       |
  0x003e:              | len2:
  0x003e: a05f         |    pushl %ebp      # Save %ebp
  0x0040: 2045         |    rrmovl %esp, %ebp   # Create new frame pointer
  0x0042: a06f         |    pushl %esi         # Save callee-save register
  0x0044: 30f604000000 |    irmovl $4, %esi      # Set %esi to 4
  0x004a: a07f         |    pushl %edi      # Save callee-save register
  0x004c: 30f701000000 |    irmovl $1, %edi      # Set %edi to 1
  0x0052: 502508000000 |    mrmovl 8(%ebp), %edx   # Get a
  0x0058: 30f100000000 |    irmovl $0, %ecx      # len = 0
  0x005e: 500200000000 |    mrmovl (%edx), %eax   # Get *a
  0x0064: 6062         |    addl %esi, %edx      # a++
  0x0066: 6200         |    andl %eax, %eax      # Test *a
  0x0068: 737e000000   |    je Done            # If zero, goto Done
  0x006d:              | Loop:
  0x006d: 6071         |    addl %edi, %ecx      # len++
  0x006f: 500200000000 |    mrmovl (%edx), %eax   # Get *a
  0x0075: 6062         |    addl %esi, %edx      # a++
  0x0077: 6200         |    andl %eax, %eax      # Test *a
  0x0079: 746d000000   |    jne Loop         # If !0, goto Loop
  0x007e:              | Done:
  0x007e: 2010         |    rrmovl %ecx, %eax   # return value = len
  0x0080: b07f         |    popl %edi          # Restore %edi
  0x0082: b06f         |    popl %esi      # Restore %esi
  0x0084: 2054         |    rrmovl %ebp, %esp   # Restore stack pointer
  0x0086: b05f         |    popl %ebp      # Restore %ebp
  0x0088: 90           |    ret
                       |
                       | # Stack starts here and grows to lower addresses
  0x0100:              |      .pos 0x100
  0x0100:              | Stack:
                       |    

Можете сверить с файлом len.yo из архива примеров к книге, прикреплённым раньше.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 12 дек 2017, 20:15 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
В этой редакции авторы рассматривают 32-бит процессор.
Но у них есть следующее, 3-е издание, в котором они перешли к 64-бит архитектуре, изменился формат команд, вместо регистров %eax, %ebx и т.д. фигурируют теперь %rax, %rbx и т.д.

3-е издание книги можно скачать здесь: Computer Systems: A Programmer’s Perspective, 3rd Edition
Цитата:
Название: Computer Systems: A Programmer’s Perspective, 3rd Edition
Авторы: David R. O'Hallaron, Randal E. Bryant
Издательство: Pearson
Год: 2015
Страниц: 1120
Язык: English
Формат: pdf
Размер: 36 mb


Поскольку это совершенно единообразно, я не буду отвлекаться на 64-бит реализацию, и остановлюсь на предыдущей редакции.

Здесь я ошибся...
Полностью материалы 3-го издания оригинала находим здесь: CSAPP 3e Solutions gitbook.
Здесь, в частности, очень много кодов, в частности, сам ассемблер yas + симулятор yis - можете попробовать собрать:
Код:
[olej@dell misc]$ pwd
/home/olej/2017_WORK/own.WORK/PureCodeCpp/Lyzunka/Y86/BOOKs/original_book/CSAPP-3e-Solutions-master/chapter4/code/sim/misc
[olej@dell misc]$ ls
examples.c  hcl.y  isa.h     mux4.hcl  node.h    outgen.h  yas.c            yas.h
hcl.lex     isa.c  Makefile  node.c    outgen.c  README    yas-grammar.lex  yis.c

Но самое интересное - это огромное число программ-кодов *.ys для тестирования и отладки - все примеры кодов, приводимые в гл.4 книги:
Код:
[olej@dell y86-code]$ pwd
/home/olej/2017_WORK/own.WORK/PureCodeCpp/Lyzunka/Y86/BOOKs/original_book/CSAPP-3e-Solutions-master/chapter4/code/sim/y86-code
[olej@dell y86-code]$ ls *.ys
abs-asum-cmov.ys  asumi.ys  asum.ys  j-cc.ys     prog10.ys  prog2.ys  prog4.ys  prog6.ys  prog8.ys  pushquestion.ys  ret-hazard.ys
abs-asum-jmp.ys   asumr.ys  cjr.ys   poptest.ys  prog1.ys   prog3.ys  prog5.ys  prog7.ys  prog9.ys  pushtest.ys

Так что собственные реализации есть прямой резон начинать именно с 64-бит варианта - гораздо больше материалов для тестирования.

P.S. И изменения в кодах в этом архиве в большинстве датированы 7-8 мес. назад, т.е. 2017г.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 16 дек 2017, 18:34 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Компиляция эталонного примера полученным компилятором yas абсолютно подобна по результату, полученному авторами книги:

И, наконец, полный комплект ... 32-бит, в соответствии с 2-м изданием книги: компилятор yas + исполняющая система (симулятор) yis :
Код:
[olej@dell Y86-32]$ ./yas -V
Y86 compiler 32-bit, version 2.20

[olej@dell Y86-32]$ ./yas -v l2 -ol2
размерность таблицы команд: 21
----------------------------------------------
Done   :   0x007e
Loop   :   0x006d
Main   :   0x0028
Stack   :   0x0100
array   :   0x0014
init   :   0x0000
len2   :   0x003e
----------------------------------------------
в файл l2.yo записано 55 строк

[olej@dell Y86-32]$ wc -l l2.yo
55 l2.yo

Код:
[olej@dell Y86]$ ./yis -v l2.yo
размер памяти программы : 0x00000100
.f
Executed 0 steps at IP = 0x0000. Status LOADING, ZF=0 SF=0 OF=0
.x -1
.f
Executed 50 steps at IP = 0x0011. Status HALT, ZF=1 SF=0 OF=0
.d
Changes to registers:
%eax:   0x00000000      0x00000004
%ecx:   0x00000000      0x00000004
%edx:   0x00000000      0x00000028
%esp:   0x00000000      0x00000100
%ebp:   0x00000000      0x00000100

Changes to memory:
0x00ec: 0x00000000      0x000000f8
0x00f0: 0x00000000      0x00000039
0x00f4: 0x00000000      0x00000014
0x00f8: 0x00000000      0x00000100
0x00fc: 0x00000000      0x00000011
.r
Registers:
%eax=0x00000004        %esp=0x00000100
%ecx=0x00000004        %ebp=0x00000100
%edx=0x00000028        %esi=0x00000000
%ebx=0x00000000        %edi=0x00000000
.m
Memory:
0x0000:  30 f4 00 01 00 00 30 f5 00 01 00 00 80 28 00 00
0x0010:  00 10 00 00 0d 00 00 00 c0 00 00 00 00 0b 00 00
0x0020:  00 a0 00 00 00 00 00 00 a0 5f 20 45 30 f2 14 00
0x0030:  00 00 a0 2f 80 3e 00 00 00 20 54 b0 5f 90 a0 5f
0x0040:  20 45 a0 6f 30 f6 04 00 00 00 a0 7f 30 f7 01 00
0x0050:  00 00 50 25 08 00 00 00 30 f1 00 00 00 00 50 02
0x0060:  00 00 00 00 60 62 62 00 73 7e 00 00 00 60 71 50
0x0070:  02 00 00 00 00 60 62 62 00 74 6d 00 00 00 20 10
0x0080:  b0 7f b0 6f 20 54 b0 5f 90 00 00 00 00 00 00 00
0x0090:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00a0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00b0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00c0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00d0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00e0:  00 00 00 00 00 00 00 00 00 00 00 00 f8 00 00 00
0x00f0:  39 00 00 00 14 00 00 00 00 01 00 00 11 00 00 00
.e

Наш симулятор, в отличие от авторского, позволяет в диалоге выполнять код пошагово (команда s - 1 шаг, x 5 - 5 последовательных команд, x -1 - выполнять до конца), с диагностикой состояний (r - регистры, m - память, f - флаги и статус, c - код очередной команды, d - отличия от начального состояния).

А вот пример выполнения того же тестового кода в авторской исполняющей системе:
Код:
[olej@dell ex.2]$ cat len.yis
Stopped in 50 steps at PC = 0x11.  Status 'HLT', CC Z=1 S=0 O=0
Changes to registers:
%eax:   0x00000000      0x00000004
%ecx:   0x00000000      0x00000004
%edx:   0x00000000      0x00000028
%esp:   0x00000000      0x00000100
%ebp:   0x00000000      0x00000100

Changes to memory:
0x00ec: 0x00000000      0x000000f8
0x00f0: 0x00000000      0x00000039
0x00f4: 0x00000000      0x00000014
0x00f8: 0x00000000      0x00000100
0x00fc: 0x00000000      0x00000011

В точности соответствует выводу диалоговой команды d.


Вложения:
Y86.220.tgz [13.88 КБ]
Скачиваний: 2
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: симулятор процессора
Непрочитанное сообщениеДобавлено: 20 дек 2017, 00:52 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10679
Откуда: Харьков
Olej писал(а):
Так что собственные реализации есть прямой резон начинать именно с 64-бит варианта - гораздо больше материалов для тестирования.

P.S. И изменения в кодах в этом архиве в большинстве датированы 7-8 мес. назад, т.е. 2017г.

А вот 64-бит вариант, в точности эквивалентный 3-му изданию книги.
Он интересен в 2-х аспектах:
- был сделан, отталкиваясь от 32-бит варианта, за несколько часов - это за счёт широкого использования регулярных выражений C++;
- за счёт такой вариабельности, расширяемости - прототип очень легко расширять ... например, командами стековой вещественной машины;
- за счёт моделирования в памяти реального процессора (Linux) вариант 64-бит довольно бессмысленный, только тянет за собой расширенные адреса и операнды ... но интерес авторам представлял из-за приближённости к Intel X86_64.


Вложения:
Y86-64.319.tgz [21.79 КБ]
Скачиваний: 3
Вернуться к началу
 Профиль Отправить личное сообщение  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
[ Time : 1.898s | 20 Queries | GZIP : On ]