Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
#1

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

03.09.2012, 21:57. Просмотров 2145. Ответов 22
Метки нет (Все метки)

Просто задание на практику. В ходе разбора самого задания возникают некоторые вопросы, помогите пожалуйста разобраться.
Само задание всё как написано в варианте:


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 команды в слове
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2012, 21:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Виртуальная машина (C++):

Сумматор - виртуальная машина - C++
По заданию мне нужно реализовать арифметические операции над сумматором(4 байта): арифметика дробная, арифметика целая знаковая. Целые -...

Виртуальная функция - C++
Всем доброго времени суток! Прошу помочь с одной проблемой. Собственно, вот программа: #include <iostream> #include <conio.h> ...

Виртуальная функция - C++
Создайте класс Matematica, определите в нем виртуальную функцию-член matem(int x, int y), которая выводит на экран значения параметров....

Виртуальная неоднозначность - C++
Не понимаю пример из книги С.Праты: class B { public: short q(); }; class C : virtual public B { public:

Виртуальная функция - C++
В учебнике дается понятие абстрактного класса, как класса содержащего хоть одну виртуальную функцию. Проблема в том, что я так и не...

Виртуальная функция - C++
Создать производный класс Trapez(равнобокая трапеция). Определить в классе наследнике: -перегруженные функции для изменения сторон ...

22
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
04.09.2012, 23:47  [ТС] #16
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ага, именно так: команды последовательно идут. Адрес последней обычно не делают, просто есть специальная команда "остановить выполнение".

Флаги — это для условных переходов. Например, если в сумматоре получается ноль, то устанавливается какой-то один специальный бит из этих 16 (флаг нуля). А команда условного перехода выполняется только тогда, когда соответствующий ей флаг установлен.
ещё раз спасибо
0
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
30.10.2012, 21:56  [ТС] #17
Снова я. Возник вопрос. Чем собственно отличается условный и безусловный переход?
Вычитала, что условный в отличие от безусловного проверяет флаги. Какие флаги? Зачем? Как это работает и на что это влияет?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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)
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
а если условный, то команда перехода будет обозначаться по разному в зависимости от того какой флаг проверять?
какие основные и очень важные флаги есть? если например я попытаюсь выскочить за границу стека?
и ещё вопрос. переход к подпрограмме и возврат, вроде бы всё понятно, но немного не могу себе представить это в коде... подпрограмма где будет распологаться в отличие от основной программы? в начале? или в принципе где угодно, просто чтобы после подпрограммы дальше код не выполнялся делается возврат?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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 на верхушке стека лежал именно адрес возврата.)
1
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
31.10.2012, 11:43  [ТС] #21
Спасибо большое за очень понятные и развёрнутые объяснения!

Добавлено через 10 часов 48 минут
Возникла вот такая проблема.
Мне нужно выполнять вычисления n раз. По сути нужно делать переходы на один и тот же фрагмент программы n раз. Соответственно нужно постоянно делать декремент и проверять не равно ли полученное значение нулю. Если равно - выходим из цикла.
=>
Сделаем условный переход, который выполняется если flag не равен нулю.
Вопрос - мне получается нужно сделать операцию загрузки значения в flag? и соответсвенно для данной задачи операцию декремента для флага?
Есть и другая идея - просто загружать число n в память и по адресу этого числа делать декрмент до тех пор пока значение не станет равно нулю. т.е. сделать проверку в операции декремента - как только значения полученное декрементом <1 или равно 0 установить флаг в значение 0. Если так, то мне в принципе не нужно реализовывать операции загрузки в флаг значения и декремента значения в флаге. А нужно лишь сделать проверку в обычной операции декремента.
Но отсюда вытекает и другой вопрос: т.к. у меня все операции реализуются через сумматор, то мне чтобы сделать декремент числа нужно загрузить его в сумматор, выполнить операцию декремента и выгрузить?
Как быть?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.10.2012, 22:06 #22
Да, арифметические действия сами и устанавливают соответствующие флаги. Иногда есть и отдельные команды для установки/сброса флагов, но они для своих целей, а не чтобы выполнять на арифметику её работу.

Если у вас только сумматор умеет складывать и это единственный регистр, то да, приведённый вами вариант — это единственный способ. Загрузить, сделать что-то, выгрузить. Естественно, выгрузка значения флаги не трогает, так что флаг будет доступен для перехода впоследствии.

Обычно, правда, для циклов выделяется отдельный регистр, так как дёргать туда-сюда память дорого. Но если такой дефицит регистров, то что поделать.
1
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
31.10.2012, 22:08  [ТС] #23
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Да, арифметические действия сами и устанавливают соответствующие флаги. Иногда есть и отдельные команды для установки/сброса флагов, но они для своих целей, а не чтобы выполнять на арифметику её работу.

Если у вас только сумматор умеет складывать и это единственный регистр, то да, приведённый вами вариант — это единственный способ. Загрузить, сделать что-то, выгрузить. Естественно, выгрузка значения флаги не трогает, так что флаг будет доступен для перехода впоследствии.

Обычно, правда, для циклов выделяется отдельный регистр, так как дёргать туда-сюда память дорого. Но если такой дефицит регистров, то что поделать.
ещё раз спасибо =)
0
31.10.2012, 22:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2012, 22:08
Привет! Вот еще темы с ответами:

виртуальная функция - C++
Вот на форуме увидел тему где приводились в пример виртуальные функции..Что это такое?И чем они различаются от обычных функций?

Виртуальная функция - C++
Ругается на метод virtual bool isOveersize() из класса publication. Что не так ? #include &quot;stdafx.h&quot; #include &lt;string&gt; #include...

C++. Виртуальная модель - C++
Заранее извиняюсь.Если подобные темы уже возникали.Но вопрос в следующем.Никто не мог бы дать ссылку,примеры,по работе с анимацией в С++.? ...

виртуальная функция - C++
class B { private: int a; int b; public: virtual void show();//есть виртуальная функция,которая выводит a и b } class...


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

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

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