симулятор процессора

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 11:58

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

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 12:22

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 КБ) 68 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 12:30

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-бит реализацию, и остановлюсь на предыдущей редакции.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 16:12

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, содержащего переопределённый оператор () ).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 16:18

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 КБ) 78 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 16:24

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>
> 
Без подобного тестера отработать синтаксис регулярных выражений практически невозможно.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 16:51

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 из архива примеров к книге, прикреплённым раньше.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 12 дек 2017, 20:15

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г.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 16 дек 2017, 18:34

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 КБ) 63 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 20 дек 2017, 00:52

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

P.S. И изменения в кодах в этом архиве в большинстве датированы 7-8 мес. назад, т.е. 2017г.
А вот 64-бит вариант, в точности эквивалентный 3-му изданию книги.
Он интересен в 2-х аспектах:
- был сделан, отталкиваясь от 32-бит варианта, за несколько часов - это за счёт широкого использования регулярных выражений C++;
- за счёт такой вариабельности, расширяемости - прототип очень легко расширять ... например, командами стековой вещественной машины;
- за счёт моделирования в памяти реального процессора (Linux) вариант 64-бит довольно бессмысленный, только тянет за собой расширенные адреса и операнды ... но интерес авторам представлял из-за приближённости к Intel X86_64.
Вложения
Y86-64.319.tgz
(21.79 КБ) 71 скачивание

Ответить

Вернуться в «Программирование»

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

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