Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Koncord
5 / 5 / 1
Регистрация: 27.09.2012
Сообщений: 65
1

[VM] Реализация аппаратных прерываний

03.08.2014, 15:07. Просмотров 530. Ответов 9
Метки нет (Все метки)

Доброго времени суток, CyberForum. Уже как 2 месяца я пишу свой велосипед - эмулятор платформы Intel 80286. Реализовал некоторые команды, память, загрузку программ в память. В данный момент я ищу любую информацию по аппаратным прерываниям, например, деление на ноль, как ведет себя процессор, что происходит с регистрами и т.д. желательно информацию на русском языке, английский знаю не уверенно.
Кому интересно, вот список оппкодов:

Opcodes.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef OPCODES_HPP
#define OPCODES_HPP
 
 
// Версия опкодов
#define VER_MAJOR 0
#define VER_MINOR 1
#define VER_FIX 0
 
 
 
namespace FLAGS
{
    enum
    {
        OF = 1,         // Переполнение
        DF = 2,         // Направление
        IF = 4,         // Прерывание
        TF = 8,         // Пошаговый режим
        SF = 16,        // Знак
        ZF = 32,        // Ноль
        AF = 64,        // Внешний перенос
        PF = 128,       // Контроль четности, паритета
        CF = 256        // Перенос
    };
}
 
namespace REG
{
    enum
    {
        AX = 0,         // Аккумулятор
        BX,             // Базовый регистр
        CX,             // Счетчик
        DX,             // Данные
 
        SI,             // Индекс источника
        DI,             // Индекс назначения
 
        SP,             // Стековый указатель
        BP,             // Базовый указатель
 
        CS,             // Регистр сегмента кода
        DS,             // Регистр сегмента данных
        SS,             // Ркгистр сегмента стека
        ES,             // Дополнительный сегментный регистр 
        IP,              // Командный указатель
 
        FLAGS = 65534  // Регистр флагов
    };
}
 
namespace MOD
{
    enum
    {
        OP = 0,         // Непосредственная адресация
        REG = 1,        // Регистровая адресация
        MEM = 2         // Косвенная адресация
    };
}
 
namespace COM
{
    enum
    {
    /*  КОМАНДА         //  АРГУМЕНТЫ   /   РЕГИСТРЫ    /   ФЛАГИ     /    КОММЕНТАРИЙ     */
        NOP = 0,        //              /               /             /
        ADD,            //  DEST, SRC   /               /             /
        JMP,            //  DEST        /               /             /
        HLT,            //              /               /             /
        JO,             //  DEST        /               /             /
        JNO,            //  DEST        /               /             /
        JE,             //  DEST        /               /             /
        JZ,             //  DEST        /               /             /
        JNE,            //  DEST        /               /             /
        JNZ,            //  DEST        /               /             /
        JS,             //  DEST        /               /             /
        JNS,            //  DEST        /               /             /
        SUB,            //  DEST, SRC   /               /             /
        MOV,            //  DEST, SRC   /               /             /
        MUL,            //  DEST        /   AX,DX       /             /
        DIV,            //  DEST        /   AX,DX       /             / Нет прерываний (INT 0h)
        NEG,            //  DEST        /               /             /
        INC,            //  DEST        /               /             /
        DEC,            //  DEST        /               /             /
        INT             //  DEST        /               /             / Не реализовано
    };
}
 
#endif  /* OPCODES_HPP */
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2014, 15:07
Ответы с готовыми решениями:

Обработчик прерываний
Есть такое задание: "При нажатии символьной клавиши с нажатой клавишей Shift...

Обработка прерываний
Доброго времени суток. Пытаюсь выполнить пример программы с использованием...

Организация обработки прерываний
Здравствуйте! Пытаюсь разобраться с механизмом обработки прерывания. Нужно...

Работа вектора прерываний
Привет. Я написал программу, которая использует прерывания INT0 INT1,...

Организация прерываний в DOS
Доброе время суток. Возникла проблема с прерываниями в DOS. Недавно начал...

9
Avazart
03.08.2014, 19:38
  #2

Не по теме:

А зачем под каждое перечисление свое пространство?

0
DrOffset
8130 / 4713 / 1152
Регистрация: 30.01.2014
Сообщений: 7,683
03.08.2014, 19:49 3

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
А зачем под каждое перечисление свое пространство?
Эмуляция enum classes.



Добавлено через 4 минуты
Koncord, ну попробуй тут посмотреть.
Но вообще это все фигня. Вот тот документ, который тебе нужен.
1
Avazart
03.08.2014, 19:49
  #4

Не по теме:

Зачем такое счастье нужно?

0
DrOffset
03.08.2014, 19:54
  #5

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Зачем такое счастье нужно?
Вот.

0
Koncord
5 / 5 / 1
Регистрация: 27.09.2012
Сообщений: 65
03.08.2014, 20:37  [ТС] 6
Цитата Сообщение от DrOffset Посмотреть сообщение
Эмуляция enum classes.

Не по теме:

Не совсем, в enum classes возникла проблема строгой типизации, получался некрасивый код, например нельзя было бы так сделать:

C++
1
2
3
4
5
6
7
8
9
switch (cell.mod)
{
case MOD::REG:
    return *reg->GetRegister(cell.addr);
case MOD::MEM:
    return ram->GetWord(cell.addr);
case MOD::OP:
    return cell.addr;
}
А если просто использовать enum, то будет конфликт повторного декларирования

0
Avazart
03.08.2014, 20:53
  #7

Не по теме:

Повторно декларирование чего ? чет не вижу тут конфликтов.

0
Koncord
03.08.2014, 21:41  [ТС]
  #8

Не по теме:

Avazart, попробуйте скомпилировать код вида
enum E1
{
A=1,
B=2,
C=3
};
enum E2
{
A=2,
B=3,
C=4
};

0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
03.08.2014, 21:51 9
Я вроде не заметил конфликтов имен в коде приведенном в первом посте.
0
Koncord
03.08.2014, 21:55  [ТС]     [VM] Реализация аппаратных прерываний
  #10

Не по теме:

Видимо когда я писал этот хедер, я пребывал в астрале :)

0
03.08.2014, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2014, 21:55
Привет! Вот еще темы с ответами:

Как реализовать обработку прерываний в С++?
Надо разработать три программных модуля, каждый процесс после запуска...

Вызов функций через таблицу прерываний
Уважаемые участники форума cyberforum.ru, очень нужна ваша помощь. Столкнулся с...

Обработка прерываний с клавиатуры на С++ с применением библиотеки dos.h
Добрый день! Очень сильно нуждаюсь в вашей помощи. Вот в чем вопрос: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru