Системное программирование

Автор: Пользователь скрыл имя, 10 Марта 2013 в 15:44, курс лекций

Описание работы

Один из основных принципов машины фон Неймана — то, что и программы, и данные хранятся в одной и той же памяти. Сохраняемая в памяти программа представляет собой некоторые коды, которые могут рассматриваться как данные. Возможно, с точки зрения программиста программа — активный компонент, она выполняет некоторые действия. Но с точки зрения процессора команды программы — это данные, которые процессор читает и интерпретирует. С другой стороны программа — это данные с точки зрения обслуживающих программ, например, с точки зрения компилятора, который на входе получает одни данные — программу на языке высокого уровня (ЯВУ), а на выходе выдает другие данные — программу в машинных кодах.

Работа содержит 1 файл

Системное программирование 15 лекций.doc

— 946.00 Кб (Скачать)

Сегмент данных: AMT1 DW 0123H

Сегмент кодов: MOV AX,AMT1

Длина непосредственных операндов

Длина непосредственной константы зависит от длины первого  операнда. Например, следующий непосредственный операнд является двухбайтовым, но регистр AL имеет только один байт:

MOV AL,0123H (ошибка)

Однако, если непосредственный операнд короче, чем получающий операнд, как в следующем примере

ADD AX,25H (нет ошибки)

то Ассемблер  расширяет непосредственный операнд  до двух байт, 0025 и записывает объектный код в виде 2500.

Непосредственные форматы

Непосредственная  константа может быть шестнадцатеричной, например, 0123H; десятичной, например, 291 (которую Ассемблер конвертирует в шест.0123); или двоичной, например, 100100011В (которая преобразуется в шест. 0123). Ниже приведен список команд, которые допускают непосредственные операнды:

Команды пересылки и сравнения

MOV, CMP.

Арифметические команды

ADC, ADD, SBB, SUB.

Команды сдвига

RCL, RCR, ROL, ROR, SHL, SAR, SHR.

Логические команды

AND, OR, TEST, XOR.

Для создания элементов, длиннее чем два байта, можно  использовать цикл или строковые  команды.

4

Директива EQU

Директива EQU не определяет элемент данных, но определяет значение, которое может быть использовано для постановки в других командах. Предположим, что в сегменте данных закодирована следующая директива EQU:

TIMES EQU 10

Имя, в данном случае TIMES, может быть представлено любым допустимым в Ассемблере именем. Теперь, в какой бы команде или  директиве не использовалось слово TIMES Ассемблер подставит значение 10. Например, Ассемблер преобразует директиву

FIELDA DB TIMES DUP (?) в FIELDA DB 10 DUP (?)

Имя, связанное  с некоторым значением с помощью  директивы EQU, может использоваться в командах, например:

COUNTR EQU 05 ...

MOV CX,COUNTR

Ассемблер заменяет имя COUNTR в команде MOV на значение 05, cоздавая операнд с непосредственным значением, как если бы было закодировано:

MOV CX,05 ;Ассемблер подставляет 05

Здесь преимущество директивы EQU заключается в том, что  многие команды могут использовать значение, определенное по имени COUNTR. В случае, если это значение должно быть изменено, то изменению подлежит лишь одна директива EQU. Естественно, что использование директивы EQU разумно лишь там, где подстановка имеет смысл для Ассемблера. В директиве EQU можно использовать символические имена:

1. TP EQU TOTALPAY

2. MPY EQU MUL

Первый пример предполагает, что в сегменте данных программы опpеделено имя TOTALPAY. Для  любой команды, содержащей операнд TP, Ассемблер заменит его на адрес TOTALPAY. Второй пример показывает возможность использования в программе слова MPY вместо обычного мнемокода MUL. 

 

Лекция 3. 
Регистры

4

Сегментные регистры: CS, DS, SS и ES

Каждый сегментный регистр обеспечивает адресацию 64 К  памяти, которая называется текущим  сегментом. Как показано ранее, cегмент выравнен на границу параграфа и его адрес в сегментном pегистре предполагает наличие справа четырех нулевых битов.

Регистр CS

Регистр сегмента кода содержит начальный адрес сегмента кода. Этот адрес плюс величина смещения в командном указателе (IP) определяет адрес команды, которая должна быть выбрана для выполнения. Для обычных программ нет необходимости делать ссылки на регистр CS.

Регистр DS

Регистр сегмента данных содержит начальный адрес  сегмента данных. Этот адрес плюс величина смещения, определенная в команде, указывают на конкретную ячейку в сегменте данных.

Регистр SS

Регистр сегмента стека содержит начальный адрес  в сегменте стека.

Регистр ES

Некоторые операции над строками используют дополнительный сегментный регистр для управления адресацией памяти. В данном контексте регистр ES связан с индексным регистром DI. В случае, если необходимо использовать регистр ES, ассемблерная программа должна его инициализировать.

4

Регистры общего назначения: AX, BX, CX и DX

При программировании на Ассемблере регистры общего назначения являются «рабочими лошадками». Особенность этих регистров состоит в том, что возможна адресация их как одного целого слова или как oднобайтовой части. Левый байт является старшей частью (high), a правый — младшей частью (low). Например, двухбайтовый регистр CX состоит из двух однобайтовых: CH и CL, и ссылки на регистр возможны по любому из этих трех имен. Следующие три ассемблерные команды засылают нули в регистры CX, CH и CL, соответственно:

MOV CX,00

MOV CH,00

MOV CL,00

Регистр AX

Регистр AX является основным сумматором и применяется  для всех операций ввода-вывода, некоторых  операций над строками и некоторых  арифметических операций. Например, команды  умножения, деления и сдвига предполагают использование регистра AX.

Некоторые команды  генерируют более эффективный код, если они имеют ссылки на регистр AX.

AX: | AH | AL |

Регистр BX

Регистр BX является базовым регистром. Это единственный регистр общего назначения, который  может использоваться в качестве «индекса» для расширенной адресации. Другое общее применение его — вычисления.

BX: | BH | BL |

Регистр CX

Регистр CX является счетчиком. Он необходим для управления числом повторений циклов и для операций сдвига влево или вправо. Регистр CX используется также для вычислений.

CX: | CH | CL |

Регистр DX

Регистр DX является регистром данных. Он применяется  для некоторых операций ввода/вывода и тех операций умножения и  деления над большими числами, которые  используют регистровую пару DX и AX.

DX: | DH | DL |

Любые регистры общего назначения могут использоваться для cложения и вычитания как 8-ми, так и 16-ти битовых значений.

4

Регистровые указатели: SP и BP

Регистровые указатели SP и BP обеспечивают системе доступ к  данным в сегменте стека. Реже они  используются для операций сложения и вычитания.

Регистр SP

Указатель стека  обеспечивает использование стека  в памяти, позволяет временно хранить  адреса и иногда данные.

Этот регистр  связан с регистром SS для адресации  стека.

Регистр BP

Указатель базы облегчает доступ к параметрам: данным и адресам переданным через стек.

4

Индексные регистры: SI и DI

Оба индексных  регистра возможны для расширенной  адресации и для использования  в операциях сложения и вычитания.

Регистр SI

Этот регистр  является индексом источника и применяется для некоторых операций над строками. В данном контексте регистр SI связан с регистром DS.

Регистр DI

Этот регистр  является индексом назначения и применяется  также для строковых операций. В данном контексте регистр DI связан с регистром ES.

4

Регистр командного указателя: IP

Регистр IP содержит смещение на команду, которая должна быть выполнена. Обычно этот регистр  в программе не используется, но он может изменять свое значение при  использовании отладчика DOS DEBUG для  тестирования программы.

4

Флаговый регистр

Девять из 16 битов  флагового регистра являются активными  и определяют текущее состояние  машины и результатов выполнения. Многие арифметические команды и  команды сравнения изменяют состояние  флагов.

Назначение флаговых битов

O (Переполнение)

Указывает на переполнение старшего бита при арифметических командах. 

 

D (Направление)

Обозначает левое  или правое направление пересылки  или сравнения строковых данных (данных в памяти превышающих длину  одного слова).

I (Прерывание)

Указывает на возможность  внешних прерываний.

T (Пошаговый режим)

Обеспечивает  возможность работы процессора в  пошаговом режиме. Например, программа DOS DEBUG устанавливает данный флаг так, что возможно пошаговое выполнение каждой команды для проверки изменения  содержимого регистров и памяти.

S (Знак)

Содержит результирующий знак после арифметических операций (0 — плюс, 1 — минус).

Z (Ноль)

Показывает результат  арифметических операций и операций сравнения (0 — ненулевой, 1 — нулевой  результат).

A (Внешний перенос)

Содержит перенос  из 3-го бита для 8-битных данных используется для специальных арифметических операций.

P (Контроль четности)

Показывает четность младших 8-битовых данных (1 — четное и 0 — нечетное число).

C (Перенос)

Содержит перенос  из старшего бита, после арифметических операций, а также последний бит при сдвигах или циклических сдвигах. При программировании на Ассемблере наиболее часто используются флаги O, S, Z, и C для арифметических операций и операций сравнения, а флаг D для обозначения направления в операциях над строками.  

 

 

  

 

 

  

 

Лекция 4. 
Арифметические операции

4

Обработка двоичных данных

Несмотря на то, что мы привыкли к десятичной арифметике (база 10), компьютер работает только с двоичной арифметикой (база 2). Кроме того, ввиду ограничения, накладываемого 16-битовыми регистрами, большие величины требуют специальной обработки.

Сложение и вычитание

Команды ADD и SUB выполняют  сложение и вычитание байтов или  слов, содержащих двоичные данные. Вычитание  выполняется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения бит и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.

Поскольку прямой операции память-память не существует, данная oперация выполняется через регистр. В следующем примере к содержимому слова WORDB прибавляется содержимое слова WORDA, описанных как DW:

MOV AX,WORDA

ADD AX,WORDB

MOV WORDB,AX

Переполнения

Опасайтесь переполнений в арифметических операциях. Один байт содержит знаковый бит и семь бит данных, то есть, значения от -128 до +127.

Результат арифметической операции может легко превзойти  емкость однобайтового регистра. Например, результат сложения в регистре AL, превышающий его емкость, автоматически  не переходит в регистр AH.

Предположим, что  регистр AL содержит шест.60, тогда результат  команды

ADD AL,20H

генерирует в AL сумму — шест.80. Но операция также  устанавливает флаг переполнения и  знаковый флаг в состояние «отрицательно». Причина заключается в том, что шест.80 или двоичное 1000 0000 является отрицательным числом, то есть, в результате, вместо +128, мы получим -128.

Так как регистр AL слишком мал для такой операции и следует воспользоваться регистром AX.

В следующем  примере команда CBW (Convert Byte to Word — преобразовать байт в слово) преобразует шест.60 в регистре AL в шест.0060 в регистре AX, передавая при этом знаковый бит (0) через регистр AH.

Команда ADD генерирует теперь в регистре AX правильный результат: шест.0080, или +128:

CBW ;Расширение AL до AX

ADD AX,20H ;Прибавить к AX

Но полное слово  имеет также ограничение: один знаковый бит и 15 бит данных, что соответствует  значениям от -32768 до +32767.

4

Беззнаковые и знаковые данные

Многие числовые поля не имеют знака, например, номер  абонента, aдрес памяти. Некоторые числовые поля предлагаются всегда положительные, например, норма выплаты, день недели, значение числа промежуточного итога. Другие числовые поля являются знаковые, так как их содержимое может быть положительным или отрицательным. Например, долговой баланс покупателя, который может быть отрицательным при переплатах, или алгебраическое число. 

 

Для беззнаковых  величин все биты являются битами данных и вместо ограничения +32767 регистр  может содержать числа до +65535. Для знаковых величин левый байт является знаковым битом.

Команды ADD и SUB не делают разницы между знаковыми  и беззнаковыми величинами, они просто складывают и вычитают биты.

В следующем  примере сложения двух двоичных чисел, первое число содержит единичный  левый бит.

Для беззнакового числа биты представляют положительное число 249, для знакового — отрицательное число -7:

Беззнаковое Знаковое

1111 1001  249 -7

+  +  +  +

0000 0010  2 +2

----------------------------------------------

1111 1011  251  -5

Двоичное представление результата сложения одинаково для беззнакового и знакового числа.

Однако, биты представляют +251 для беззнакового числа и -5 для  знакового. Таким образом, числовое содержимое поля может интерпретироваться по разному.

Состояние «перенос»  возникает в том случае, когда имеется пеpенос в знаковый разряд.

Состояние «переполнение» возникает в том случае, когда  перенос в знаковый разряд не создает  переноса из разрядной сетки или  перенос из разрядной сетки происходит без переноса в знаковый разряд.

При возникновении переноса при сложении беззнаковых чисел, результат получается неправильный.

При возникновении  переполнения при сложении знаковых чисел, результат получается неправильный.

При операциях  сложения и вычитания может одновременно возникнуть и переполнение, и перенос. 

Информация о работе Системное программирование