Автор работы: Пользователь скрыл имя, 21 Апреля 2016 в 13:07, контрольная работа
Представление положительных целых чисел в двоичном коде.
Представление целых чисел со знаком в двоичном коде. Прямой, дополнительный код. Модифицированный дополнительный код, для чего применяется.
Результат умножения помещается также в фиксированное место, определяемое размером сомножителей:
mul множитель_1 |
Назначение: операция умножения двух целочисленных двоичных значений со знаком. Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:
Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:
Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом:
Команда imul устанавливает в ноль флаги of и cf, если размер результата соответствует регистру назначения. Если эти флаги отличны от нуля, то это означает, что результат слишком велик для отведенных ему регистром назначения рамок и необходимо указать больший по размеру регистр для успешного завершения данной операции умножения. Конкретными условиями сброса флагов of и cf в ноль являются следующие условия:
div делитель
Назначение: выполнение операции деления двух двоичных беззнаковых значений. Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя, который указывается в команде:
idiv делитель
Назначение: операция деления двух двоичных значений со знаком. Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, местонахождение которого указывается в команде:
Остаток всегда имеет знак делимого. Знак частного зависит от состояния знаковых битов (старших разрядов) делимого и делителя. Команда выполняет целочисленное деление операндов с учетом их знаковых разрядов. Результатом деления являются частное и остаток от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.
Безусловный переход — это переход, который выполняется всегда. Безусловный переход осуществляется с помощью команды JMP. У этой команды один операнд, который может быть непосредственным адресом (меткой), регистром или ячейкой памяти, содержащей адрес. Существуют также «дальние» переходы — между сегментами, однако здесь мы их рассматривать не будем.
Условный переход осуществляется, если выполняется определённое условие, заданное флагами процессора (кроме одной команды, которая проверяет CX на равенство нулю). Как вы помните, состояние флагов изменяется после выполнения арифметических, логических и некоторых других команд. Если условие не выполняется, то управление переходит к следующей команде.
Для огранизации циклов используется комманда Loop
<метка>
<тело цикла>
LOOP <метка>
Команду loop применяют для организации цикла со счетчиком. Количество повторений цикла задается значением в регистре ecx/cx перед входом в последовательность команд, составляющих тело цикла. Помните о двух важных моментах:
Стек структура данных, представляющая собой список элементов, организованных по принципу «последним пришёл — первым вышел».
Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Возможны три операции со стеком: добавление элемента (иначе проталкивание, push), удаление элемента (pop) и чтение головного элемента(peek).
При проталкивании (push) указывается новый элемент, указывающий на элемент бывший до этого головой. Новый элемент теперь становится головным.
При удалении элемента убирается первый, а головным становится тот, на который был указатель у этого объекта (следующий элемент).
void push( STACK *ps, int x ) // Добавление в стек нового элемента
{
if ( ps->size == STACKSIZE ) // Не переполнен ли стек?
{
fputs( "Error: stack overflow\n", stderr );
abort();
}
else
{
ps->items[ps->size++] = x;
}
}
int pop( STACK *ps ) // Удаление из стека
{
if ( ps->size == 0 ) // Не опустел ли стек?
{
fputs( "Error: stack underflow\n", stderr );
abort();
}
else
{
return ps->items[--ps->size];
}
}