Конспект лекций по курсу Ассемблер (Алещенко) (Раздаточный материал), страница 3
Описание файла
Файл "Конспект лекций по курсу Ассемблер (Алещенко)" внутри архива находится в папке "Ассемблер". Документ из архива "Раздаточный материал", который расположен в категории "". Всё это находится в предмете "ассемблер" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МАИ. Не смотря на прямую связь этого архива с МАИ, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "ассемблер" в общих файлах.
Онлайн просмотр документа "Конспект лекций по курсу Ассемблер (Алещенко)"
Текст 3 страницы из документа "Конспект лекций по курсу Ассемблер (Алещенко)"
в) Относительная адресация
Место перехода указывается как некоторое расстояние от самой команды перехода. Эффективный адрес перехода вычисляется суммированием индекса смещения, находится в команде и текущего значения указателя команд 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)
-
Символьные данные
Символьные данные хранятся в памяти ПЭВМ в двоично-кодированном виде, причем каждый символ кодируется одним байтом, что позволяет закодировать 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, т.е. «последним пришел – первым ушел»).