Реферат: Государственное Образовательное Учреждение высшего профессионального образования Московский Авиационный Институт Государственный Технический Университет "маи" кафедра 304. конспект



Министерство Образования и Науки РФ

Федеральное Агентство по Образованию

Государственное Образовательное Учреждение

высшего профессионального образования

Московский Авиационный Институт

Государственный Технический Университет

”МАИ”


кафедра 304.


Конспект лекций по курсу
ЯЗЫК АССЕМБЛЕРА IBM PC



Москва, 2006 год


Место языков ассемблера среди языков программирования


Языки программирования – это языки, воспринимаемые вводными устройствами ЦВМ. Общая классификация языков программирования (ЯП) приведена на схеме:



Языки программирования



Алгоритмические языки Машинно-зависимые

(высокого уровня) языки







Универсальные Проблемно-ориен- ЯСК Машинные

тированные Языки ассемблера


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

Рассмотрим язык ассемблера на примере IBM-совместимых персональных ЭВМ (ПЭВМ). К этому классу относятся

ПЭВМ, построенные на базе микропроцессоров (МП) фирмы Intel (семейства 8086, 80x86 - i486, Pentium, Celeron, Atlon и т.п.).

МПК 1810 (ЕС 1840 и т.п.)

В настоящее время широко используются микропроцессоры таких производителей как DEC (Digital Equipment Corporation), HP (Hewlett Packard) и др. Эти микропроцессоры используют систему микрокоманд и ЯА существенно отличающуюся от фирмы Intel, но при программировании используются те же принципы.
^ Регистровая структура МП Intel 8086:

ПЭВМ семейства 80x86 можно представить как совокупность следующих программно-логических элементов МП:

а) в МП:

Рабочие регистры;

Счётчик команд;

Регистры флагов;

Стек;

б) связанные с МП:

Память;

Система команд;

Система ввода\вывода;

Система прерывания.



Регистровая структура МП 80x86 приведена на схеме, она включает в себя 4 группы 16-разрядных регистров, которые обслуживают функционирование операционного устройства (ОУ) и шинного интерфейса (ШИ).

Операционное устройство (ОУ) Шинный интерфейс (ШИ)


AH AL

Регистры BH BL

данных CH CL Регистры сегментов

DH DL CS

SP DS

Регистры- BP SS

указатели SI ES

DI

Управление

шиной I P

очередь

команд



АЛУ УУ

PSW


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

AX

Аккумулятор

AH, AL

BX

Базовый регистр

BH, BL

CX

Счетчик

CH, CL

DX

Регистр данных

DH, DL

Допускается обращение к частям этих регистров, т.е. старшему байту (вторая буква Н) и младшему байту (вторая буква L).
^ Регистровые указатели
Группа содержит непосредственно указатели

SP – указатель стека,

BP – указатель базы

и индексные регистры

SI – индекс источника,

DI – индекс приемника.

Регистры-указатели используются для работы со специальной структурой памяти – стеком; индексные регистры используются при выборке операндов из памяти.
^ Регистры сегментов (сегментные регистры)
Сегментация памяти позволяет укоротить адресные коды, кроме того, каждый сегмент имеет свое предназначение, что повышает надежность программ.

CS (Code Segment) – регистр сегмента команд, определяет начало сегмента, содержащего адрес текущей выполняемой команды;

DS (Data Segment) – регистр сегмента данных, определяет начало сегмента, содержащего константы и данные;

SS (Stack Segment) – регистр сегмента стека, указывает на начало сегмента стека;

ЕS (Extension Data Segment) – регистр дополнительного сегмента данных, определяет начало сегмента, который обычно используется для запоминания промежуточных данных или как расширение сегмента данных. В более поздних моделях МП есть дополнительные сегменты:

FS, GS – дополнительные сегменты данных

LDTR – регистр локальной таблицы дескрипторов.
^ Указатель команд и регистр флагов
IP – указатель команд, выполняет роль счетчика команд; его содержимое – это смещение относительно начального адреса сегмента команд (CS).

Во время выполнения программы содержимое регистра IP изменяется и всегда хранит адрес следующей выбираемой для выполнения команды.

Flags (PSW) – регистр флагов, содержит информацию о текущем состоянии МП. Рассмотрим структуру регистра флагов подробнее :


Flags













OF

DF

IF

TF

SF

ZF




AF




PF




CF




15










11

10

9

8

7

6




4




2




0



Флаги разделяют на:

условные (флаги условий), отражающие результаты выполнения предыдущей команды в АЛУ и используемые в командах условных переходов;

управляющие (флаги управления), от которых зависит выполнение специальных функций МП.

^ Условные флаги в алфавитном порядке.

AF (Auxiliary Carry flag) – флаг вспомогательного переноса, предназначенный для обработки чисел в BCD-формате, используется при выполнении арифметических операций над числами длиной 1 байт для индикации переноса из младшей тетрады в старшую (или займа из старшей тетрады). Здесь BCD (Binary Coded Decimal) – двоично-десятичное представление чисел (каждая десятичная цифра кодируется двоичной тетрадой)

CF (Carry flag) – флаг переноса, предназначен для индикации переноса из старшего байта, используется в операндах, разрядность которых больше 16 бит.

OF (Overflow flag) – флаг переполнения, предназначен для индикации переполнения результатов при выполнении арифметических операций. При сложении он устанавливается в 1, если есть перенос в старший бит, но нет переноса из старшего бита.

PF (Parity flag) – флаг четности, используется как контрольный бит, устанавливается в 1, если младший байт содержит четное число единиц.

SF (Sign flag) – флаг знака, равен 1 для отрицательного результата.

ZF (Zero flag) – признак нулевого результата.

Управляющие флаги устанавливаются программным путем и используются для изменения состояния МП.

DF (Direction flag) – флаг направления, применяется в командах обработки строк. При DF=1 обработка осуществляется от наибольшего адреса к меньшему, а при DF=0 – от начала к концу.


^ Установка флага осуществляется следующими командами ассемблера:

Команда

Устанавливает значение DF

STD

1

CLD

0



IF (Interrupt-Enable flag) – разрешение прерывания, используется для разрешения или запрета обработки внешнего маскируемого прерывания. Устанавливается командами ассемблера

Команда

Значение IF

Результат установки

STI

1

Обработка прерывания разрешена

CLI

0

Обработка прерывания запрещена



TF (Trap flag) – трассировка, используется для осуществления покомандного (пошагового) выполнения программы. При TF=1 МП автоматически вырабатывает внутренние прерывания после каждой команды, что удобно для отладочного режима выполнения программы. Изменить состояние флага TF довольно сложно.


Две части МП:

ОУ – операционное устройство, выполняет команды; содержит АЛУ, УУ и 10 регистров. Эти устройства обеспечивают выполнение команд, арифметических вычислений и логических операций.

ШИ – шинный интерфейс, подготавливает команду и данные для выполнения; содержит 3 элемента:

Блок управления шиной

Очередь команд

Сегментные регистры



Структура команд

Операционная часть

Адресная часть
^ В командах ЯА:
Мнемоника

Адресная часть

Машинные команды МП занимают от 1 до 6 байтов, причём операционная часть занимает 1 или 2 первых байтов команды, остальное адресная часть.

Операнды могут быть указаны:

В самой команде(непосредственная адресация)

В одном из регистров, тогда в команде указывается этот регистр (регистровая адресация)

В оперативной памяти (ОП) по адресу, который тем или иным образом описан в команде (прямая, базовая или индексная адресация)

Некоторые команды требуют, чтобы один из операндов находился в определённом регистре (например в AX), тогда он не указывается в команде( подразумеваемая адресация)

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

В общем виде запишем : op1 := op1 * op2, где * - какая-то команда, заданная МНК(мнемоникой); op1 – регистр или ячейка памяти, 1 байт или одно слово (2 байта); op2 – непосредственный операнд - регистр или ячейка памяти, 1 байт или одно слово (2 байта).
^ Система команд МП Intel 80x86

Арифметические команды
Команды сложения и вычитания
Операции сложения и вычитания одинаково для знаковых и беззнаковых целых. Используются две формы операндов: байт или слово, причем операнды должны быть одинаковой длины. Операнды могут храниться в регистре или в ОП, но второй операнд может быть непосредственным.

Перечислим команды, относящиеся к группе команд сложения и вычитания:

Группа а) ADD op1, op2 ; op1 := op1+op2

SUB op1, op2 ; op1 := op1 – op2

Сложение (вычитание) операндов в дополнительном двоичном коде, результат помещается на место первого операнда, второй операнд не изменяется.

Команды корректируют регистр флагов FLAGS в соответствии с результатом операции, а именно:

ZF – нулевой рез-т,

SF – знак результата,

PF – флаг четности,

CF, AF – флаги переносов,

OF – флаг переполнения.


Примеры:

ADD AH, 12 ; AH := AH + 12 (1Б)

SUB z, BX ; z := z – BX (2Б)


Группа б) ADC op1, op2 ; op1 := op1+op2+CF

SBC op1, op2 ; op1 := op1 – op2 – CF

Сложение (вычитание) операндов с переносом, образованным предыдущей командой.Модифицирует флаги аналогично группе а.

Например, если требуется сложить двойные слова, расположенные в парах регистров

(AX, BX) := (AX, BX) + (CX, DX),

причем AX, CX – старшие байты слагаемых,

BX, DX – младшие байты.

Сложение выполняется двумя командами:

ADD BX, DX

ADC AX, CX


Группа в) Специальный случай сложения – изменение операнда на единицу.

INC op ; op := op +1 (инкремент)

DEC op ; op := op –1 (декремент)

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

Группа г) ^ Десятичная коррекция - анализ и преобразование сложения(вычитания) для BCD кодов. BCD-операнды обрабатываются обычными командами сложения и вычитания, а затем размещается команда десятичной коррекции, которая обрабатывает только один байт данных, находящихся в AL, поэтому команды десятичной коррекции операндов не имеют (подразумеваемая адресация).

DAA; коррекция после сложения

DAS; коррекция после вычитания.

Например:

ADD AL, y

DAA

SUB AL, DH

DAS

BCD-операнды, представленные более, чем одним байтом должны обрабатываться побайтно.

Команды десятичной коррекции модифицирует флаги аналогично п.(а), за исключением флагов AF и OF.
^ Дополнительные команды

Группа а) Команда сравнения

CHP op 1, op 2; op 1 - op2

Результат нигде не запоминается, команда корректирует арифметические флаги ZF, SF,PF,CF,AF,OF.


Группа б) Команда изменения знака

NEG op ; op := -op.

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

Пример,

MOV AH, 1 ; AH := 1

NEG AH ; AH := -1

Если операнд равен нулю, то его значение не изменяется.

Команда корректирует флаги аналогично группе а; причем

CF=1, кроме случая, когда операнд равен нулю;

OF=0, кроме случая, когда op=-128 (для 1Б) = 80h (это значит, что число заняло всю разрядность), тогда OF=1, а операнд остается без изменения.
^ Команды умножения и деления


Группа а) Умножение

MUL op ; умножение целых чисел без знака

IMUL op ; умножение целых чисел со знаком

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

Команды действуют одинаково:

- для байтов AX := AL*op

- для слов (DX,AX) := AX*op

Т.к. результат получается удвоенной разрядности относительно операндов, то при умножении слов он располагается в стандартной паре регистров (DX,AX), причем DX хранит старшие разряды. Команды модифицируют флаги:

СF=OF=0 , если старшая половина результата AH нулевая или совпадает по знакам.

СF=OF=1 , если старшие разряды не нулевые.


Группа б) Деление

DIV op; деление целых чисел без знака

IDIV op; деление целых чисел со знаковом

где op – аналогично умножению.

Команды выполняют деление нацело и формируют два результата: целое частное и остаток.

Деление слова на байт выполняется по схеме

АН:=АХ mod op (остаток)

AL:=AX div op (частное)


Деление двойного слова на слово

DX := (DX,AX) mod op

AX := (DX,AX) div op

При делении слова на байт делимое заранее должно быть размещено в аккумуляторе и сдвинуто в сторону младшего байта в АХ или AL соответственно. Деление является дополнительной к умножению командой.

Флаги не модифицируются, но может возникнуть ошибка «деление на ноль или переполнение», которая возникает, если делитель нулевой или частное не помещается в соответствующее ему место.

При появлении этой ошибки микропроцессор прекращает выполнение программы.
^ Команды преобразования длины


Эти команды часто требуются перед делением, флаги – не модифицируют.

CBW – преобразует байт со знаком в AL, в слово со знаком в АХ путем распространения старшего бита AL по всем разрядам AH;

CWD – преобразует слово со знаком в АХ в двойное слово со знаком в (DX,AX) аналогично CBW.


Так же существуют команды десятичной коррекции умножения и деления AAM, AAD


Команды обработки битов

Данная группа команд отличается отсутствием межразрядных переносов. Команды делятся на 2 группы.

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

Общие черты:

Выполняют побитовую обработку операндов параллельно, без переносов; единица трактуется как «истина», ноль – «ложь»;

модифицируют флаги, но важен только флаг ZF «нулевой результат»;

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



^ Перечислим основные команды

NOT op; отрицание (инверсия кода). Флаги не модифицирует.

AND op1, op2; op1:= op1^ op2

Например, 0Fh ^ 15h = 05h

^

00001111

00010101




00000101



OR op1, op2; op1:= op1 v op2

Например, 0Fh v 15h = 1Fh

XOR op1, op2; op1 := op1  op2

Например, 0Fh v 15h = 1Ah

TEST op1, op2; op1^ op2 – результат не запоминается;

Эта операция называется «логическое сравнение». Цель формирование флага ZF = 1 - если результат нулевой, иначе ZF = 0.

Как правило, второй операнд трактуется как маска, хранящая единицы в тех разрядах, которые нужны для дальнейшей обработки.


^ 2) Команды сдвигов

Сдвиги на n разрядов влево можно трактовать, как умножение на 2n, потому все команды сдвигов имеют 2 операнда:

оp1 – рассматривается, как набор битов, подлежащих сдвигу влево или вправо;

op2 – константа сдвига, т.е. целое число без знака, определяющее величину сдвига нового операнда; может принимать значение 1 или CL. Единица означает сдвиг на 1 разряд, а CL – содержимое регистра CL, хранящего значение n. Сдвиг с CL выполняется как повтор однократных сдвигов, содержимое CL не меняется, при CL=0, сдвиг блокируется. Результат записывается на место первого операнда. Команды сдвига модифицируют флаги, кроме AF, а “уходящий” бит фиксируется в CF.

Команды сдвига бывают логические, арифметические и циклические.

^ Рассмотрим их на командах однократного сдвига:

Логический сдвиг – для беззнаковых чисел может применяться для ускоренного умножения (деления) на 2, выполняется по схеме


CF


op

SHL op,1 ; сдвиг влево

SHR op,1 ; сдвиг вправо 0

Арифметический сдвиг – применяется для ускоренного умножения (деления) на 2 чисел со знаком, выполняется по схеме

SAL op,1 ; сдвиг влево

SAR op,1 ; сдвиг вправо 0


Циклический сдвиг – для беззнаковых целых, выполняется по схеме

ROL op,1 ; сдвиг влево

ROR op,1 ; сдвиг вправо


Циклический сдвиг через флаг (уходящий бит возвращается в операнд и одновременно фиксируется в CF), выполняется по схеме


R
CF


op

CL ор,1 сдвиг влево

RCR op,1 сдвиг вправо


Циклические сдвиги позволяют образовать передачу числа последовательным кодом и анализировать разряды числа. В МП 80286 и позже допускается использование второго операнда без загрузки в CL (непосредственный операнд), т.е. SHL AX,3 ;


^ Сегментация памяти
Память трактуется как одномерный массив байтов, каждый байт ассоциируется с двоичным адресом (номером), который называется физическим адресом.

Физический адрес – это 20-битовое беззнаковое целое от 0h до FFFFFh (метка h обозначает 16-ричную систему счисления), которое позволяет описать адресное пространство объемом 1 Мбайт.

Разрядность основного слова МП равна 2 Байта = 16 бит, поэтому для вычисления физического адреса используется выделение из адресного пространства сегментов по 64Кбайта (216), и в пределах сегмента можно определять адрес с помощью 16-битового кода.

Сегменты в адресном пространстве должны размещаться, только начиная с байтов, адреса которых кратны 16, т.е. 4 младших бита – нулевые. Такие адреса называются параграфами.

^ Логический адрес представляет собой пару двухбайтовых беззнаковых целых чисел, разделенных двоеточием:

начальный адрес сегмента (базовый),

смещение (эффективный адрес), указывает расстояние в байтах от начала сегмента до адресуемой ячейки памяти.

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

CS : IP

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

15 12 11 0

DS

начальный адрес сегмента

0 0 0 0

+




15 0

смещение внутри сегмента




19 0

физический адрес байта



^ Ячейка памяти – это неделимый в данной операции набор последовательных битов.


^ Команды передачи управления
Это наиболее важная часть системы команд, тесно связанная со структурой ПЭВМ, и является промежуточным звеном между командами МП и командами языка ассемблера, т.к. здесь существенна запись операндов. Команды передачи управления вызывают нарушение линейности программы.

Рассмотрим общие аспекты передачи управления. Наиболее важная особенность – это методы адресации, используемые для определения адреса ячейки памяти, куда передаётся управление

^ Близкие и далекие переходы.


Переходы в ЯА кодируются от слова Jump. Например, безусловный переход:

JMP оp,

где ор – имя команды, которой передается управление (т.е. метка).

Команды перехода модифицируют указатель команд IP и, возможно, регистр сегмента команд CS и бывают двух типов:

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

если изменяется пара регистров CS:IP, - это межсегментный переход или далекий переход FAR.

Обычно адрес перехода ассоциируется с меткой команды. Метка – это имя команды, которое располагается до мнемоники команды и отделяется двоеточием. Любая программная метка (включая имя процедуры) имеет атрибут NEAR или FAR.

Например,

АМ1: ADD AX,4

………………….

JMP AM1
^ Адресация переходов
а) Прямая адресация.

Команда содержит в себе базовый адрес сегмента и смещение. Это допускается только в командах межсегментного перехода или вызова процедур. Метка, которой передается управление, должна иметь атрибут FAR.

JMP CATS

где CATS – метка команды или имя процедуры, а JMP – аналог GOTO.

б) ^ Косвенная адресация

Адрес перехода содержится в регистре или ячейке памяти. Это допускается для межсегментных и внутрисегментных переходов.

JMP AX ; в АХ заранее помещен перехода

^ JMP NEAR COD[BX]

Во втором примере есть явное указание типа перехода (NEAR – оператор в команде), COD[BX] – базовая адресация команды, которой передается управление.


в) ^ Относительная адресация

Место перехода указывается как некоторое расстояние от самой команды перехода. Эффективный адрес перехода вычисляется суммированием индекса смещения, находится в команде и текущего значения указателя команд IP.

Имеется 2 типа:

с 8 битовым индексным смещением, обеспечивает передачу управления в диапазоне (-128:128Б) (SHORT)

с 16 битовым индексным смещением

(-32 768:32768Б) от текущей команды NEAR

Операндом является метка с атрибутом NEAR, по которой ассемблер автоматически вычисляет значение. В команде может быть указан тип перехода:

mov w, offset L1; (в ячейку w записывается смещение L1 относительно ; текущей команды offset – смещение)

…………………………….

JMP w или JMP SHORT w ;то тогда проверяется корректность программы ; ; (действительно ли short )


^ Команды условных переходов делятся на 2 группы:

а) операторы, анализирующие результаты предыдущей команды (флаги) – условный переход в классическом понимании. Они имеют только 1-байтовое смещение.

Если условный переход требует удаление более чем на 128Б (30-40 команд), то используется комбинация условного и безусловного перехода.

Например:

Требуется NEAR переход на метку ZERO по флагу ZF=1, тогда

………..

JNZ CONTINUE; if ZF<>1 then continue

JMP ZERO

CONTINUE

Т.е. используется условный переход по противоположному признаку, а по ZF=1 получим 2-хбайтовый переход.

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

E – equal (=)

N – not (не)

G – больше для знаковых целых

L – меньше для знаковых целых

A – above (выше) беззнаковых

B –below (ниже) для беззнаковых

В условных переходах используется после J от одной до трех букв (из перечисленных выше).

Например, после сравнения чисел результат ор1<ор2, возможны 2 команды, эквивалентные между собой для одного и того же перехода.

Для знаковых JL ADRES

^ JMGE ADRES

Для беззнаковых JB ADRES

JNA ADRES


б) команды управления итерацией(циклом) :

LOOP ор

Управление циклом по счетчику, где ор – метка первой команды цикла, цикл управляется счетчиком в СХ.

Команда LOOP уменьшает содержимое СХ (dec СХ) и передает управление в начало цикла, если содержимое СХ<>0, иначе управление передается команде следующей за LOOP.

Обычно цикл оформляется следующим образом.

mov CX,N ; СХ = числу переходов цикла

L1: ……… начало цикла

……………….

LOOP L1;


Команда LOOP эквивалентна 3-м командам:

Dec CX

Cmp CX, 0

Jne L1

Цикл должен быть в рамках short.

Особенности команды LOOP:

счетчик цикла находится только в CX;

начальное значение загружается в CX>0 до входа в цикл;

команды прохода цикла выполняются хотя бы один раз;

LOOP осуществляет переход типа SHORT, поэтому проход цикла не должен занимать 128Б (30-40 команд); если нужен более длинный проход цикла, то используется сочетание условных и безусловных переходов;

CX может использоваться как операнд в цикле, но не должен изменяться другими командами.

Есть и другие команды управления циклом. Например, команды перехода по циклу с дополнительным условием, а именно с учетом флага ZF. Можно использовать 2 эквивалентные записи:

LOOPE op

LOOPZ op

Здесь цикл повторяется CX раз, пока сохраняется ZF=1, что соответствует сложному условию передачи управления CX<>0 AND ZF=1. Эти команды управления циклом обычно используются для решения задач поиска в последовательностях, их основной недостаток состоит в том, что неочевидна причина выхода их цикла, и требуется дополнительный анализ по окончании цикла.


^ Представление данных в ПЭВМ


Целые числа
ЭВМ поддерживает работу с числами, длиной в :

байт (1Б);

слово (2Б);

двойное слово (4Б);

Выделяются 2 типа целых чисел:

беззнаковые (неотрицательные);

числа со знаком.

Это позволяет использовать 2 диапазона чисел. Например, для 1 байта

беззнаковое целое от 0 до 255 (28 – 1),

целое со знаком по модулю от 0 до 127 (27 – 1).

а) Беззнаковые числа представляются в двоичной системе, занимая все разряды ЯП.

Например, для десятичного числа 98 = 62h = 01100010B требуется 1Б, можно использовать слово 0062h (2Б). Слово в памяти располагается в польской инверсной записи, а в регистрах – в естественном порядке байтов.

Для чисел длиной в двойное слово – аналогично.

Например, число 12345678h в оперативной памяти по адресу w располагается следующим образом:




y

y+1

y+2

y+3







78

56

34

12






б) Целые числа со знаком представляются в дополнительном коде, т.е.



Х доп.= 



Х, Х>0

2к-|X|, X<0 ,

где k – разрядность ЯП.

Например, для числа -98 = 9Eh (1 Б)= FF9Eh (слово 2Б).

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

- все цифры, кроме младшей заменяются инверсией, т.е. для 16-ричной системы счисления (15 – {цифра});

- последняя (младшая) цифра заменяется дополнением, т.е. (16 – {цифра});

- правые нулевые разряды не изменяются, и младшим разрядом считается самый правый ненулевой разряд.

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

В памяти числа длиной в слово или двойное слово хранятся в польской инверсной записи, причем знаковый разряд попадает в последний байт.
^ Двоично-десятичные числа (BCD)
Существуют классы задач, для которых характерен ввод и выводом больших массивов числовых данных с последующим применением небольшого числа арифметических операций. Для этого случая используется двоично-десятичное представление чисел (BCD – Binary Coded Decimal), которое образуется следующим образом:

каждая десятичная цифра представляется двоичной тетрадой, т.е. используются цифры от 0 до 9, а цифры от A до F - не используются.

Имеется 2 разновидности BCD-формата:

а) неупакованный формат – в каждом байте в младшей тетраде размещается код десятичной цифры, а значение старшей тетрады байта игнорируется. Этот формат используется при вводе и выводе чисел, и содержимое старшей тетрады определяется в соответствии с ASCI I.

Например, для положительного числа получим код

9806  хххх1001хххх1000хххх0000хххх0110 (4 Б);

б) упакованный формат – в каждом байте хранятся две цифры.

Например, для того же числа получим код

9806  1001100000000110 (2 Б).

Отрицательные числа в BCD представляются в дополнительном коде. Алгоритм формирования дополнительного кода описан выше, но для BCD формата имеет вид:

- все цифры, кроме младшей заменяются инверсией, т.е. (9 – {цифра});

- последняя (младшая) цифра заменяется дополнением, т.е. (10 – {цифра});

- правые нулевые разряды не изменяются, и младшим разрядом считается самый правый ненулевой разряд.

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

Например, для числа 561 в упакованном формате получим

561  00000101 01100001 (2 Б)

для отрицательного числа

[-567]доп =

10000000

1001 0100

0011 1001




знак

9 4

3 9

В памяти числа хранятся в польской инверсной записи(LEM)
0>^ Символьные данные
Символьные данные хранятся в памяти ПЭВМ в двоично-кодированном виде, причем каждый символ кодируется одним байтом, что позволяет закодировать 256 различных символов.

Используется система кодирования ASCI I (American Standard Code for Information Interchange) – американский стандартный код для информационного обмена.

Основные особенности кодировки ASCI I:

код пробела меньше кода любого графически представляемого символа и не является нулевым байтом;

коды цифр упорядочены по возрастанию и идут без пропусков

код(i) = код(‘0’)+i,

где i - цифра от 1-9,

код(‘0’) <> нулю (т.е. не нулевой байт);

коды заглавных латинских букв упорядочены по алфавиту без пропусков;

то же верно для малых латинских букв;

Для кодирования кириллицы используются несколько альтернативных кодировок.

Например, в кодировке CP1251, широко используемой в системах Microsoft Windows коды букв кириллицы (заглавных и строчных) также упорядочены по алфавиту.

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

Например: строка ‘Ав_с»’ будет представлена в памяти по адресу x последовательностью байтов

x

x+1

x+2

x+3




код(‘A’)

код(‘в’)

код(‘_’)

код(‘с’)



^ Вещественные данные
Вещественные данные обрабатываются сопроцессором Intel 8087 (вспомогательным процессором). Современные МП типа Pentium имеют встроенный сопроцессор. Сопроцессор позволяет выполнить дополнительный набор арифметических команд над числами разных типов:

целые со знаком (2Б);

короткие целые со знаком (4Б);

длинные целые со знаком (8Б);

упакованные BCD-формата (10Б);

короткие вещественные (4Б);

длинные вещественные (8Б)

временные вещественные (10Б).

В упакованном BCD-формате число занимает 10 байтов, причем первый байт – знак числа, остальные 9Б могут хранить 18 цифр.

Например: числа в сопроцессоре представлены в виде

00 00 00 00 00 12 34 56 78 90 - положительное число,

80 99 99 99 99 87 65 43 21 00 - отрицательное число.

При вводе знак “+“ не требуется, достаточно записать все значащие цифры числа.

^ Вещественные числа представляются в экспоненциальной форме

А = М * 2Р ,

где М – мантисса числа,

р – двоичный порядок числа.

Порядок определяет положение дробной точки в числе. Для упрощения арифметики используется смещенный порядок (характеристика) числа р*. Нулевой порядок смещается на 127, тогда порядок числа вычисляется по формуле

p = р*-127

Мантисса представляется в нормализованном виде в двоичной системе счисления так, чтобы старшая цифра находилась в разряде целых единиц. Т.к. эта цифра присутствует всегда к=1, то ее наличие подразумевается, а в памяти ее не хранят.

Для вещественных чисел используют 3 формата:

короткое вещественное (4Б)

31

30 23

22 0




характеристика

мантисса

знак









длинное вещественное (8Б)

63

62 52

51 0




характеристика

мантисса

знак









временное вещественное

79

78 64

63 0




характеристика

мантисса

знак







В сопроцессоре есть восемь 10-байтовых регистров. Набор этих регистров чаще всего используется в режиме стека, но можно обращаться к конкретному регистру по имени от ST(0) до ST(7).


^ Работа со стеком


Стек – это область оперативной памяти, запись и чтение данных в которой основан на принципе LIFO (Last input first output, т.е. «последним пришел – первым ушел»).

Последовательность данных, которая загружена в стек, может быть считана только в обратном порядке. Стек используется в ПЭВМ для временного хранения данных, необходимых для организации процедур, для передачи параметров в процедуры, а так же для хранения некоторых промежуточных данных. Считывание и загрузка в стек осуществляется двухбайтовыми словами.

Стек организуется программно в памяти, для стека можно отвести любую область памяти, удовлетворяющую двум требованиям:

максимальная емкость 64КБ (32К слов),

конечный адрес должен быть кратным 16 (параграф).

Стек занимает один сегмент памяти, называемый сегментом стека, с сегментным регистром SS, указывающим на начало, т.е. базу стека. Для работы со стеком обычно используют косвенную адресацию через регистр SP – указатель стека, указывающий на текущую ячейку стека, называемую вершиной стека.

В начале работы с SP указывают на последнюю ячейку сегмента стека. При загрузке числа автоматически производится декремент SP := SP–2.

Считывание числа из стека сопровождается автоматическим инкрементом: SP := SP+2, причем считается, что ячейка стека свободна и готова для последующего использования, но ее содержимое после считывания не изменяется.

Для дополнительного обращения к элементам стека (не через вершину) можно использовать регистр ВР, называемый дополнительным указателем стека. Доступ к элементам стека через BP осуществляется на основе определённого расстояния о нужного слова до вершины стека и базовой адресацией:

mov BP,SP ; настройка на вершину стека

mov AX,[BP+4] ; эквивалентно mov AX,SS:[BP+4]

BP по умолчанию относится к сегменту стека, а не к сегменту данных!!!Если в программе нет явного использования стека, то необходимо его зарезервировать в объеме 128Б для автоматического использования.
^ Стековые команды

а) PUSH op; запись слова в стек, флаги не модифицируются

ор – может быть в регистре (в том числе и в сегментном) или в ячейке памяти, но не непосредственный операнд.

Алгоритм выполнения:

декремент значения SP:=SP–2;

пересылка содержимого ор на сводную ячейку стека с адресом [SS:SP] (в польской инверсной записи).

Пример:

PUSH AX

Примечания:

- SP используется по умолчанию

- Записать можно только слово

- Если организуется стековый сегмент в максимальном объеме (64КБ), то при полном заполнении, происходит разрушение ранее записанной информации




- Если стек имеет меньший размер, то при полном его заполнении каждое новое обращение разрушает область памяти вне стекового сегмента


SS 128Б










б) РОР ор ; чтение слова из стека

ор – аналогично PUSH.

Алгоритм выполнения:

слово из ячейки стека пересылается в ор (порядок байтов восстанавливается),

инкремент SP := SP +2

Пример:

POP CX


Примечание: Если пытаться считывать из пустого стека, то ошибка не фиксируется, а считывается слово, следующее за сегментом стека.

в) PUSHF ; копирование слова из регистра FLAGS в стек

POPF ; копирование слова из стека в регистр FLAGS

ор отсутствует, флаги не изменяются.

Эти команды позволяют модифицировать флаг TF. Т.к. другого пути воздействия на TF нет, то нужно выполнить засылку флага в стек, затем изменить 8-й бит и записать новое значение из стека в регистр FLAGS.
Доступ к элементам стека с помощью регистра ВР

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

Например:

MOV BP,SP ; BP := SP

MOV AX,[BP+4] ; эквивалентно MOV AХ, SS:[BP+4]


ВР по умолчанию относится к сегменту стека, а не к сегменту данных!!!
^ Конструкции языка Ассемблера
Любой язык пр
еще рефераты
Еще работы по разное