Форум программистов, компьютерный форум CyberForum.ru

Виртуальная машина - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
03.09.2012, 21:57     Виртуальная машина #1
Просто задание на практику. В ходе разбора самого задания возникают некоторые вопросы, помогите пожалуйста разобраться.
Само задание всё как написано в варианте:


PSW - 32 бита = 16+16 = IP + Flags
Память - слова по 48 бит, размер адреса = 16 бит
сумматор - 48 бит
адресный регистр - 16 бит

ТИпы данных:
Целые знаковые - 48 бит
Дробные - 48 бит: знак - 1 бит, порядок - 7 бит, мантисса - 40 бит; код прямой.

Структура команды - 24бита:
код операции - 7 бит, b - 1 бит
b=0 -адрес(абсолютная адресация)
b=1 - адрес + регистр (индексная или базовая)
Адрес - 16 бит
Две команды в слове

Загрузка адресного регистра:
b = 0 - адрес(константа) в команде (константа = адрес)
b = 1 - регистр + константа в команде
загрузка-сохранения сумматора
арифметика дробная на сумматоре
арифметика целая знаковая на сумматоре; реализация операций "вручную"
переходы:
Безусловный прямой: IP = адрес (константа в команде);
бит b работает по схеме загрузки адресного регистра:
b = 0 - адрес(константа) в команде (константа = адрес)
b = 1 - регистр + константа в команде
если адрес = 0, то это косвенный переход по адресному регистру
условный - то же самое, проверяет флаги;
вызов подпрограммы, адрес возврата сохраняется в адресном регистре
возврат - безусловный переход прямой: b = 1, регистр + 0


Теперь вопросы:
судя по заданию получается что у меня всего 1 регистр??? преподаватель объяснял, что сумматор используется в качестве ячейки памяти. т.е. получается все вычисления происходят с помозью одного регистра и сумматора? я поняла это так: одно значение загружается в регистр, второй в сумматор, для них вызывается операция и результат записывается в сумматор.
поясните пожалуйста насколько поняли

Добавлено через 6 минут
и ещё не понятно зачем 2 команды в слове
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2012, 21:57     Виртуальная машина
Посмотрите здесь:

виртуальная функция C++
Виртуальная функция C++
C++ виртуальная функция
C++ Сумматор - виртуальная машина
C++. Виртуальная модель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.09.2012, 22:02     Виртуальная машина #2
Я так понял, у вас два регистра: адресный и сумматор.

Адресный используется для косвенной/индексной адресации и переходов. Загружается либо напрямую, либо инкрементируется.

Сумматор используется для арифметики. Загружается только (?) из памяти, можно выгрузить в память. Арифметика выполняется так: "сумматор := сумматор <операция> ячейка памяти". Ячейка памяти, соответственно, адресуется либо непосредственно, либо косвенно через адресный регистр.

По две команды в слове шоб було, это не критично.
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
03.09.2012, 22:08  [ТС]     Виртуальная машина #3
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Я так понял, у вас два регистра: адресный и сумматор.

Адресный используется для косвенной/индексной адресации и переходов. Загружается либо напрямую, либо инкрементируется.

Сумматор используется для арифметики. Загружается только (?) из памяти, можно выгрузить в память. Арифметика выполняется так: "сумматор := сумматор <операция> ячейка памяти".

По две команды в слове шоб було, это не критично.
у меня представлены 2 варианта адресации - абсолютная и индексная, абсолютная это получается загрузка на прямую а индексная как? где-то читала, что это смещение должно быть. а в самом задании (наверху я всё написала) указано адрес+регистр. это как? что значит это адрес+регистр? я сначала подумала, что от адреса который сейчас определённое смещение должно быть..
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.09.2012, 22:10     Виртуальная машина #4
Абсолютная — это когда адрес, откуда брать данные для операции, указан прямиком в команде.
Индексная — это база + смещение. База у вас — это значение адресного регистра. Смещение указывается прямиком в команде.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
03.09.2012, 22:25     Виртуальная машина #5
судя по заданию получается что у меня всего 1 регистр???
Ничего удивительного, бывают стековые машины :-)
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
03.09.2012, 23:08  [ТС]     Виртуальная машина #6
а вот ещё вопрос про загрузку адресного регистра. я так поняла речь идёт о загрузке данных в этот регистр. в задание вот что:
b = 0 - адрес(константа) в команде (константа = адрес)
b = 1 - регистр + константа в команде
не могу разобраться, что за константа имеется в виду, что за костанта в команде и константа = адрес, не могли бы вы разъяснить как это всё работает?

Добавлено через 1 минуту
и просто для уточнения - загрузка-сохранение сумматора, загрузка - загружаем данные, а сохранение это имеется ввиду сохранение результата операции в сумматоре? по крайней мере я так поняла
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.09.2012, 23:15     Виртуальная машина #7
Цитата Сообщение от PinkPink Посмотреть сообщение
а вот ещё вопрос про загрузку адресного регистра. я так поняла речь идёт о загрузке данных в этот регистр. в задание вот что:
b = 0 - адрес(константа) в команде (константа = адрес)
b = 1 - регистр + константа в команде
не могу разобраться, что за константа имеется в виду, что за костанта в команде и константа = адрес, не могли бы вы разъяснить как это всё работает?
Ну, вот у вас же:
Структура команды - 24бита:
код операции - 7 бит, b - 1 бит
b=0 -адрес(абсолютная адресация)
b=1 - адрес + регистр (индексная или базовая)
Адрес - 16 бит
Значит, команда выглядит так:
Код
       2                   1                   0
 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
[       константа адреса        |    опкод    |b]
Вот есть команда загрузки адресного региста. У неё есть какой-то код операции (опкод). Если в команде бит b будет установлен в ноль, то константа адреса будет тупо скопирована в адресный регистр. Если в единицу, то она будет прибавлена к нему. Эта же константа для других команд играет роль смещения для индексной адресации или абсолютного адреса, откуда брать данные/куда класть результат.

Цитата Сообщение от PinkPink Посмотреть сообщение
и просто для уточнения - загрузка-сохранение сумматора, загрузка - загружаем данные, а сохранение это имеется ввиду сохранение результата операции в сумматоре? по крайней мере я так поняла
Сохранение, по идее, это запись содержимого сумматора в ячейку памяти. Адрес, куда класть, берётся или из команды (при абсолютной адресации), или это то, что в команде, + адресный регистр (при индексной адресации).
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
03.09.2012, 23:48  [ТС]     Виртуальная машина #8
значит для сумматора нужно реализовать обе операции отдельно? и загрузка и сохранение..
а то написано как-то через тире в задании
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 00:04     Виртуальная машина #9
Ну да. Загрузка — сохранение, вдох — выдох. Просто как противопоставление.
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
04.09.2012, 00:29  [ТС]     Виртуальная машина #10
вообщем получается так: с условием того что команда это код операции - 7 бит, b - 1 бит
b=0 -адрес(абсолютная адресация)
b=1 - адрес + регистр (индексная или базовая)
Адрес - 16 бит
пытаюсь сложить 2 числа,
указываю код операции загрузки в сумматор, затем тип адресации, затем адрес ячейки памяти. => положили число в сумматор
затем выполняю сложение сумматора и данных в памяти -
указываю код операции сложения, тип адресации и адрес ячейки памяти со вторым значением
=> сложили, результат в сумматор записали
далее сохраняем данные, аналогично - код операции сохранения, тип адресации, номер ячейки.

вопрос: зачем нужна загрузка адресного регистра, что с ней делать и куда прикрутить? может я алгоритм не правильно поняла?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 01:02     Виртуальная машина #11
Цитата Сообщение от PinkPink Посмотреть сообщение
пытаюсь сложить 2 числа,
указываю код операции загрузки в сумматор, затем тип адресации, затем адрес ячейки памяти. => положили число в сумматор
затем выполняю сложение сумматора и данных в памяти -
указываю код операции сложения, тип адресации и адрес ячейки памяти со вторым значением
=> сложили, результат в сумматор записали
далее сохраняем данные, аналогично - код операции сохранения, тип адресации, номер ячейки.
Именно так.

Цитата Сообщение от PinkPink Посмотреть сообщение
вопрос: зачем нужна загрузка адресного регистра, что с ней делать и куда прикрутить? может я алгоритм не правильно поняла?
Ну, например, мы хотим сложить несколько чисел, расположенных последовательно в памяти (то есть массив). Загружаем адрес первого элемента массива в адресный регистр (с помощью буквального указания адреса прямо в команде). После этого достаточно последовательно вызывать команды "прибавить к аккумулятору число, хранящееся в ячейке памяти с адресом "<содержимое адресного регистра> + 0" (индексная адресация) и "увеличить адресный регистр на 1" (тот самый вариант установки его содержимого "регистр (текущее состояние) + константа в команде (тут это 1)").
Правда, немного затруднительно с одним регистром будет сделать нормальный цикл.
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
04.09.2012, 22:16  [ТС]     Виртуальная машина #12
такой вопрос - мне в память только значения-входные данные загружать? а команды считывать прямо из файла? или нужно выгрузить всю программу в память, а потом с ней работать? если работать прямо с файлом, что делать если будут переходы?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 22:21     Виртуальная машина #13
Вся программа располагается где-то в памяти виртуальной машины. Есть специальный регистр:
PSW - 32 бита = 16+16 = IP + Flags
в котором вон те первые 16 бит (IP) указывают, в какой именно ячейке памяти следующ... следующие две команды лежат.
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
04.09.2012, 23:37  [ТС]     Виртуальная машина #14
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вся программа располагается где-то в памяти виртуальной машины. Есть специальный регистр:

в котором вон те первые 16 бит (IP) указывают, в какой именно ячейке памяти следующ... следующие две команды лежат.
получается я считываю из файла всю программу целиком в память или сначала все входные данные, а затем команды?
вообщем, конкретно как работать с файлом. у меня например первая строка - число. я проверяю число это или команда. если число записываю в память. а если попадается команда? мне её также следом записать в памяти? тогда ip будет указывать на ячейку памяти в которой лежит эта новая команда, правильно? затем в фале ещё одна команда, я снова её считываю в память и теперь ip обновляется и там уже другие данные, а в результате где брать предыдущие? во общем, немного не понятно как этим айпи пользоваться

Добавлено через 1 час 8 минут
Цитата Сообщение от PinkPink Посмотреть сообщение
получается я считываю из файла всю программу целиком в память или сначала все входные данные, а затем команды?
вообщем, конкретно как работать с файлом. у меня например первая строка - число. я проверяю число это или команда. если число записываю в память. а если попадается команда? мне её также следом записать в памяти? тогда ip будет указывать на ячейку памяти в которой лежит эта новая команда, правильно? затем в фале ещё одна команда, я снова её считываю в память и теперь ip обновляется и там уже другие данные, а в результате где брать предыдущие? во общем, немного не понятно как этим айпи пользоваться
я тут подумала.. что если сначалавыписать все данные, а затем команды, тогда всё становится на свои места. в ip адрес первой команды, адреса всех остальных команд можно получить инкрементом, если в памяти они записаны последовательно. единственное, что нужно наверное хранить где-то адрес последней команды, это может быть во второй части psw? там же 16+16, правда в задании написано ip + flags.. что за флагс
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 23:45     Виртуальная машина #15
Ага, именно так: команды последовательно идут. Адрес последней обычно не делают, просто есть специальная команда "остановить выполнение".

Флаги — это для условных переходов. Например, если в сумматоре получается ноль, то устанавливается какой-то один специальный бит из этих 16 (флаг нуля). А команда условного перехода выполняется только тогда, когда соответствующий ей флаг установлен.
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
04.09.2012, 23:47  [ТС]     Виртуальная машина #16
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ага, именно так: команды последовательно идут. Адрес последней обычно не делают, просто есть специальная команда "остановить выполнение".

Флаги — это для условных переходов. Например, если в сумматоре получается ноль, то устанавливается какой-то один специальный бит из этих 16 (флаг нуля). А команда условного перехода выполняется только тогда, когда соответствующий ей флаг установлен.
ещё раз спасибо
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
30.10.2012, 21:56  [ТС]     Виртуальная машина #17
Снова я. Возник вопрос. Чем собственно отличается условный и безусловный переход?
Вычитала, что условный в отличие от безусловного проверяет флаги. Какие флаги? Зачем? Как это работает и на что это влияет?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.10.2012, 22:30     Виртуальная машина #18
У процессора есть регистр с флагами. Это набор битов, которые соответствуют определённым состояниям и устанавливаются определёнными командами при определённых условиях. К примеру, для IA-32 один из них зовётся ZF — zero flag, он устанавливается в 1, если значением последней операции был ноль, и сбрасывается в 0 в противном случае.

Безусловный переход перепрыгивает безусловно, то есть всегда. Ему без разницы, что там и как там в флагах.
Assembler
1
2
3
4
5
6
7
8
        movl a, %eax
        movl b, %ecx
        addl %ecx, %eax  ; сумма a + b в регистре eax
        jmp error
        ; 100500 строк кода
        ret
error:
        ; обработка ошибки
В этом случае переход на метку error будет производится всегда. А если написать следующим образом, тогда переход будет выполняться только в том случае, если сумма равна нулю: addl установит флаг ZF в этом случае, а условный переход jz на него среагирует. Если флаг будет сброшен, то jz ничего не делает:
Assembler
1
2
3
4
5
6
7
8
        movl a, %eax
        movl b, %ecx
        addl %ecx, %eax  ; сумма a + b в регистре eax
        jz error
        ; 100500 строк кода
        ret
error:
        ; обработка ошибки (a + b == 0)
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
30.10.2012, 22:39  [ТС]     Виртуальная машина #19
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
У процессора есть регистр с флагами. Это набор битов, которые соответствуют определённым состояниям и устанавливаются определёнными командами при определённых условиях. К примеру, для IA-32 один из них зовётся ZF — zero flag, он устанавливается в 1, если значением последней операции был ноль, и сбрасывается в 0 в противном случае.

Безусловный переход перепрыгивает безусловно, то есть всегда. Ему без разницы, что там и как там в флагах.
Assembler
1
2
3
4
5
6
7
8
        movl a, %eax
        movl b, %ecx
        addl %ecx, %eax  ; сумма a + b в регистре eax
        jmp error
        ; 100500 строк кода
        ret
error:
        ; обработка ошибки
В этом случае переход на метку error будет производится всегда. А если написать следующим образом, тогда переход будет выполняться только в том случае, если сумма равна нулю: addl установит флаг ZF в этом случае, а условный переход jz на него среагирует. Если флаг будет сброшен, то jz ничего не делает:
Assembler
1
2
3
4
5
6
7
8
        movl a, %eax
        movl b, %ecx
        addl %ecx, %eax  ; сумма a + b в регистре eax
        jz error
        ; 100500 строк кода
        ret
error:
        ; обработка ошибки (a + b == 0)
спасибо, кажется понятно.
т.е. если мы хотим безусловный переход, то пишем jmp
а если условный, то команда перехода будет обозначаться по разному в зависимости от того какой флаг проверять?
какие основные и очень важные флаги есть? если например я попытаюсь выскочить за границу стека?
и ещё вопрос. переход к подпрограмме и возврат, вроде бы всё понятно, но немного не могу себе представить это в коде... подпрограмма где будет распологаться в отличие от основной программы? в начале? или в принципе где угодно, просто чтобы после подпрограммы дальше код не выполнялся делается возврат?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 23:19     Виртуальная машина
Еще ссылки по теме:

C++ Виртуальная функция
C++ Виртуальная функция
Виртуальная функция C++

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.10.2012, 23:19     Виртуальная машина #20
Цитата Сообщение от PinkPink Посмотреть сообщение
т.е. если мы хотим безусловный переход, то пишем jmp
а если условный, то команда перехода будет обозначаться по разному в зависимости от того какой флаг проверять?
какие основные и очень важные флаги есть?
Ага.

Вот списочек флагов для IA-32. Чаще всего условные переходы делаются по арифметике. Перенос, переполнение, ноль. Нулевой флаг заодно является "универсальным": есть кучка инструкций для сравнения (больше, меньше и т. п.), которые его устанавливают, так что он заодно может использоваться для "перейти если a >= b" и т. п.


Цитата Сообщение от PinkPink Посмотреть сообщение
и ещё вопрос. переход к подпрограмме и возврат, вроде бы всё понятно, но немного не могу себе представить это в коде... подпрограмма где будет распологаться в отличие от основной программы? в начале? или в принципе где угодно, просто чтобы после подпрограммы дальше код не выполнялся делается возврат?
Подпрограмма располагается где угодно. (Можно хоть внутри главной программы, но это немного неудобно. Обычно где-нибудь рядом, за ней сразу же, к примеру.)

Обычно как делается. Есть две инструкции: call и ret. Первая заталкивает текущее значение счётчика команд (IP) в стек; после этого делается (безусловный) переход на код подпрограммы. Подпрограмма для возврата выполняет инструкцию ret, которая достаёт из стека адрес возврата и устанавливает его как новое значение счётчика команд. (Конечно, это головная боль подпрограммы сбалансировать push и pop внути себя, чтобы к моменту вызова ret на верхушке стека лежал именно адрес возврата.)
Yandex
Объявления
30.10.2012, 23:19     Виртуальная машина
Ответ Создать тему
Опции темы

Текущее время: 08:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru