Слайд 1Архитектура младшей модели семейства Intel
Память
Рассматриваемый компьютер имеет архитектуру с адресуемыми
регистрами, адресуемая память состоит из основной и регистровой памяти. Основная
память имеет объём 220 ячеек по 8 бит каждая, при этом каждая команда или данные располагаются в одной или нескольких последовательных (с возрастающими адресами) ячейках этой памяти.
Слайд 2Форматы данных
Вещественные числа
На современных ЭВМ чаще всего используются три формата
вещественных чисел:
короткие (длиной 4 байта),
длинные (8 байт)
и
сверхдлинные (16 байт) вещественные числа.
На момент массового выпуска ЭВМ с командами для работы с вещественными числами, уже существовал международный стандарт на внутреннее представление этих чисел (ANSI/IEEE standart 754-1985), и почти все современные машины придерживаются этого стандарта на представление вещественных чисел.
Слайд 3
Целые числа в младшей модели могут занимать в памяти 8
бит (короткое целое), 16 бит (длинное целое) и 32 бита
(сверхдлинное целое). Длинное целое принято называть машинным словом
(не путать с машинным словом в машине Фон Неймана, там это содержимое одной ячейки памяти!).
Целые числа
Слайд 4Символьные данные
В качестве символов используются короткие целые числа, которые трактуются
как неотрицательные (беззнаковые) числа, задающие номер символа в некотором алфавите.
Слайд 5Массивы (строки)
Допускаются только одномерные массивы, которые могут состоять из коротких
или длинных целых чисел. Массив коротких целых чисел может рассматриваться
программистом как символьная строка, отсюда и второе название этой структуры данных. В машинном языке присутствуют команды для обработки элементов таких массивов
Слайд 6Логические (битовые) вектора.
В языке машины представлены команды для обработки логический
векторов длиной 8 или 16 бит. Элементы таких векторов трактуются
как логические переменные..
Двоично-десятичные целые числа.
Это целые числа в двоично-десятичной записи, имеющие размер до 16 байт.
Слайд 8Вещественные числа
Такое представление вещественного числа называется нормализованным:
его первый
сомножитель удовлетворяет неравенству:
Слайд 9–13.25
Сначала переведём его в двоичную систему счисления:
–13.2510 = -1101.012
Затем нормализуем
это число:
-1101.012 = -1.101012*23
Следовательно, мантисса нашего числа будет иметь вид
101010000000000000000002 , и осталось вычислить машинный порядок
E: 3 = E-127; E = 130 = 128+2 = 100000102 .
Учитывая знак, получаем вид внутреннего машинного представления числа –13.2510:
1100 0001 0101 0100 0000 0000 0000 00002 = C154000016
Слайд 10Шестнадцатеричные числа в языке Ассемблера принято записывать с буквой h
на конце,
при этом, если такое число начинается с буквы, то
впереди записывается незначащий ноль, чтобы отличить запись такого числа от имени:
C154000016 = 0C1540000h
Слайд 11Представимый диапазон порядков коротких вещественных чисел равен
2–126..2127 ≈ 10–38..1038
Слайд 12Из-за конечной длины представления вещественных чисел действия с ними выдают
приближённый результат
Слайд 13Возможно:
Возможны случаи, когда (a+b)+c ≠ a+(b+c) и (a+b)*c ≠ a*c+b*c.
Решение простейшего уравнения X+A=A будет равен, скажем, 10+6.
Слайд 14
Значение машинного порядка E=255 при мантиссе M ≠ 0
обозначает специальное значение "не число" (NAN – not a number).
Некоторые комбинации нулей и единиц в памяти, отведённой под хранения вещественного числа, используются для служебных целей.
Слайд 15Машинный порядок E=255 при мантиссе M = 0 задаёт, в
зависимости от знака числа, специальные значения
Слайд 16Целые числа
Беззнаковые (неотрицательные) числа представляются в двоичной системе счисления -
прямым кодом
Если инвертировать прямой код (т.е. заменить все "1"
на "0", а все "0" на "1"), то получим обратный код числа.
Для представления отрицательных знаковых чисел используется дополнительный (complementary) код, который можно получить из обратного кода прибавлением единицы.
Слайд 18Другой способ
Дополнительный код числа –13 можно вычислить и так:
28-13 =
256–13 = 100000000–00001101 = 11110011
Слайд 19Если сложить дополнительный код с прямым кодом, то получится ноль
и "лишняя" единица, не помещающаяся в отводимое число разрядов.
Слайд 20Результат операций могут быть разными для знаковых и беззнаковых чисел
Слайд 21Для таких ситуаций в архитектуре компьютера введено понятие флагов. Каждый
флаг занимает один бит в специальном регистре флагов с именем
FLAGS. Для рассмотренного выше примера флаг CF (carry flag) после сложения примет значение, равное единице (иногда говорят, что флаг поднят), сигнализируя программисту о том, что при без- знаковом сложении произошла ошибка. Рассматривая результат в знаковых числах, мы получили правильный ответ, поэтому флаг результата знакового сложения OF (overflow flag) будет положен равным нулю (или, как говорят, опущен).
Флаг CF называется флагом переноса,
а OF – флагом переполнения.
Флаги
Слайд 22Существует флаг SF, в который всегда заносится знаковый (крайний левый)
бит результата, таким образом, при знаковой трактовке чисел этот флаг
сигнализирует, что результат получился отрицательным.
Флаг ZF, устанавливается в 1, если результат тождественно равен нулю, в противном случае этот флаг устанавливается в 0. Флаги в нашей архитектуре выполняют ту же роль, что и регистр признака результата ω в изученной ранее учебной ЭВМ УМ-3.
Слайд 23Сегментация памяти
Память нашей ЭВМ имеет сегментную организацию. В любой момент
времени для младшей модели определены четыре сегмента (хотя для старших
моделей число сегментов больше). Есть четыре сегментных регистра, которые указывают на определённые области памяти. Каждый сегментный регистр имеет длину 16 разрядов, а в то же время для адресации любого места нашей памяти необходимо, как мы уже говорили, 20 разрядов. Для того чтобы сегмент мог указывать на некоторое место оперативной памяти, адрес начала сегмента получается после умножения значения сегментного регистра на число 16. При таком способе задания начала сегмента, он может начинаться не с любого места оперативной памяти, а только с адресов, кратных 16 (в некоторых книгах по Ассемблеру такие участки памяти называются параграфами).
Слайд 24Физический адрес числа или команды вычисляется центральным процессором по формуле
Слайд 25В качестве мнемонических обозначений сегментных регистров выбраны следующие двухбуквенные служебные
имена:
кодовый сегментный регистр (CS),
сегментный регистр данных (DS),
сегментный регистр
стека (SS)
дополнительный сегментный регистр (ES).
Слайд 26Сегментные регистры являются специализированными, предназначенными только для хранения адресов сегментов,
поэтому арифметические операции (сложение, вычитание и др.) над их содержимым
в языке машины не предусмотрены.
Заметим, что даже если все сегменты не перекрываются и имеют максимальный размер, то и в этом случае центральный процессор в каждый момент времени имеет доступ только к одной четвёртой от общего объёма оперативной памяти.
Слайд 28только для хранения адресов сегментов
Слайд 29Мнемонические обозначения регистров
Регистры общего назначения, каждый из которых может складывать,
вычитать и просто хранить данные, а некоторые – ещё умножать
и делить, обозначают следующими служебными именами:
AX, BX, CX, DX.
Для обеспечения многообразия форматов данных каждый из них разбит на две части по 8 бит.
Слайд 30Каждый из регистров AH, AL, BH, BL, CH, CL, DH
и DL может быть использован в машинных командах как самостоятельный
регистр, на них можно выполнять операции сложения и вычитания.
Слайд 31Существуют также четыре регистра с именами SI, DI, SP и
BP, которые также могут использоваться для проведения сложения и вычитания,
но они уже не делятся на половинки:
В основном эти четыре регистра используются как индексные, т.е. на них обычно храниться положение конкретного элемента в некотором массиве. Условное обозначение - r16 (а AH, AL, BH, BL, CH, CLи т.п. – r8)
Слайд 33Кроме перечисленных выше регистров программист имеет дело с регистром IP
(instruction pointer), который называется счётчиком адреса (в учебной машине мы
обозначали его как RA). Этот регистр содержит адрес следующей исполняемой команды (точнее, содержит смещение этой команды относительно начала кодового сегмента, адрес начала этого сегмента равен значению сегментного регистра CS, умноженному на 16).
И, наконец, как уже упоминалось, архитектурой изучаемой ЭВМ предусмотрен регистр флагов с именем FLAGS. Он содержит шестнадцать одноразрядных флагов, например, флаги CF и OF.
Слайд 35Особенности хранения чисел в регистровой и основной памяти ЭВМ
Запишем, например,
шестнадцатеричное число 1234h в какой-нибудь 16-тиразрядный регистр (каждая шестнадцатеричная цифра
занимает по 4 бита):
Слайд 36Перешлём машинной командой содержимое этого регистра в память в ячейки
с адресами, например, 100 и 101. В ячейку с первым
(старшим) адресом 100 при такой пересылке запишется число из младшего байта регистра 34h, а в ячейку со вторым (младшим) адресом 101 запишется число из первого (старшего) байта регистр 12h.
Говорят, что целое число представлено в основной памяти (в отличие от регистров) в перевёрнутом виде.
Слайд 38Команды этого формата занимают в памяти 2 байта.
Первое поле
команды – код операции – занимает 6 первых бит( до
64 различных операций).
Однобитные поля с именами d и w,
где d –бит направления, а w – бит размера аргумента,
последующие два бита для этого формата всегда равны 11,
а последние две части (по 3 бита каждая) -
задают номера регистров-операндов команды.
Команды этого формата занимают в памяти 2 байта.
Первое поле команды – код операции – занимает 6 первых бит( до 64 различных операций).
Однобитные поля с именами d и w,
где d –бит направления, а w – бит размера аргумента,
последующие два бита для этого формата всегда равны 11,
а последние две части (по 3 бита каждая) -
задают номера регистров-операндов команды.
Слайд 39Назначение битов d и w
Бит d задаёт направление выполнения команды,
а именно:
Слайд 40Бит w задаёт размер регистров-операндов, а соответствие двоичных номеров регистров
и их
имён можно определить по таблице
Слайд 41Для проведения операций над числами разной длины появляется необходимость преобразования
типов из короткого целого в длинное, и из длинного в
сверхдлинное (и наоборот). Такое преобразование зависит от знаковой или беззнаковой трактовки числа.
Слайд 43Для преобразования знаковых целых чисел из более короткого формата в
более длинный в языке машины предусмотрены безадресные команды, имеющие в
Ассемблере такую мнемонику:
cbw (convert byte to word)
и
cwd (convert word to double),
которые производят знаковое расширение соответственно значения регистра AL до AX и AX до значения пары регистров (так называемой регистровой пары), которые в этом случае рассматриваются как один длинный 32-х битный регистр.
Слайд 44Формат регистр–память (и память-регистр).
КОП r1 A2
Второй операнд A2 может в
этом формате иметь один из приведённых ниже трёх видов:
1. A2
= A,
2. A2 = A[M1],
3. A2 = A[M1][M2].
Здесь A – задаваемое в команде число (смещение) длиной 1 или 2 байта (заметим, что нулевое смещение иногда может не задаваться и совсем не занимать места в команде), M1 и M2 – так называемые регистры-модификаторы. Как мы сейчас увидим, значение адреса второго операнда A2 будет вычисляться по определённым правилам, поэтому этот адрес часто называют исполнительным адресом.
Слайд 45
Подробнее каждый их трёх возможных видов второго операнда A2 см.
в Приложении «Возможные виды второго операнда»
Слайд 46Команды языка машины
Команды пересылки
Все они пересылают значение одного или двух
байт из одного места памяти в другое. Для более компактного
описания синтаксиса машинных команд введём следующие условные обозначения (с некоторыми из них мы уже знакомы):
r8 – любой короткий регистр AH,AL,BH,BL,CH,CL,DH,DL;
r16 – любой из длинных регистров AX,BX,CX,DX,SI,DI,SP,BP;
m8, m16, m32 – операнды, расположенные в основной памяти длиной 1,2 и 4 байта;
i8, i16, i32 – непосредственные операнды в самой команде длиной 1, 2 и 4 байта;
SR – один из трёх сегментных регистров SS, DS, ES;
CS – кодовый сегментный регистр.
Слайд 47Общий вид команды пересылки в двухадресной ЭВМ такой (после точки
с запятой будем записывать, как это принято в Ассемблере, комментарий
к команде):
mov op1,op2; op1 := op2
Существуют следующие допустимые форматы первого и второго операндов команды пересылки, запишем их в виде таблицы, где во второй колонке перечислены все возможные вторые операнды, допустимые для операнда из первой колонки:
Слайд 48Команды пересылок не меняют флаги в регистре FLAGS. Команды пересылок
с кодом операции mov бывают форматов
RR, RX (и XR),
RI и SI.
Команда обмена содержимым двух операндов, команда также не меняет флаги
xchg op1,op2;
Таблица допустимых операндов для этой команды:
Слайд 49Арифметические команды
КОП op1,op2,
где КОП = add, sub, adc, sbb.
Команды
с кодами операций add (сложение) и sub (вычитание) выполняются по
схеме:
op1 := op1 ± op2
Слайд 50Команды с кодами операций adc (сложение с учётом флага переноса)
и sbb (вычитание с учётом флага переноса) имеют три операнда,
два из которых задаются в команде явно, а третий по
умолчанию является значением флага переноса CF:
op1 := op1 ± op2 ± CF
Слайд 51Таблица допустимых операндов для
этих команд:
Слайд 52Команды умножения и деления целых чисел
Первый операнд всех команд этого
класса явно в команде не указывается и находится в фиксированном
регистре, заданном по умолчанию. В младшей модели семейства есть следующие команды умножения и деления, в них, как и в одноадресной ЭВМ, явно задаётся только второй операнд (т.е. второй сомножитель или делитель):
mul op2; беззнаковое умножение,
imul op2; знаковое умножение,
div op2; беззнаковое целочисленное деление,
idiv op2; знаковое целочисленное деление.
Слайд 53В случае с коротким вторым операндом форматов r8 и m8
при умножении вычисление производится по формуле:
AX := AL * op2
В
случае с длинным вторым операндом форматов r16 и m16 при умножении вычисление производится по формуле:
:= AX * op2
Как видим, в этом случае произведение располагается сразу в двух регистрах (это называется регистровой парой).
Схема выполнения короткого и длинного умножения.
Слайд 54При делении на короткий операнд форматов r8 и m8 производятся
следующие действия:
AL := AX div op2
AH := AX mod op2
При
делении на длинный операнд формата r16 и m16 вычисление производится по формулам:
AX := div op2
DX := mod op2
В этих командах операнд запись обозначает 32-разрядное целое число, расположенное сразу в двух регистрах DX и AX, а op2, как уже говорилось, может иметь формат r16 или m16
Слайд 55Схема выполнения короткого и длинного деления
Слайд 56После выполнения команд умножения устанавливаются некоторые флаги, из которых для
программиста представляют интерес только флаги переполнения и переноса (CF и
OF).
Эти флаги устанавливаются по следующему правилу. CF=OF=1, если в произведении столько значащих (двоичных) цифр, что они не помещаются в младшей половине произведения. На практике это означает, что при значениях флагов CF=OF=1 произведение коротких целых чисел не помещается в регистр AL и частично "переползает" в регистр AH. Аналогично произведение длинных целых чисел – не помещается в регистре AX и "на самом деле" занимает оба регистра . И наоборот, если CF=OF=0, то в старшей половине произведения (соответственно в регистрах AH и DX) находятся только незначащие двоичные цифры произведения (это двоичные нули для положительных и двоичные единицы для отрицательных произведений). Другими словами, при CF=OF=0 в качестве результата произведения можно взять только его младшую половину, что может оказаться полезным при программировании.
Слайд 57Для написания программ на Ассемблере нам будут нужны также следующие
унарные арифметические операции.
neg op1; взятие обратной величины знакового числа, op1:=-op1;
inc
op1; увеличение (инкремент) аргумента на единицу, op1:=op1+1;
dec op1; уменьшение (декремент) аргумента на единицу, op1:=op1-1;
Здесь операнд op1 может быть форматов r8, m8, r16 и m16. Применение этих команд вместо соответствующих по действию команд вычитания и сложения приводит к более компактным программам. Необходимо, однако, отметить, что компактные команды inc op1 и dec op1 , в отличие от эквивалентных им более длинных команд add op1,1 и sub op1,1 никогда не меняют флаг CF.1
Слайд 60Программа на ассемблере MASM 4
data segment ;сегмент данных программы
string db "Hello
word",13,10,"$"
data ends
code segment ;кодовый сегмент программы
assume cs:code,ds:data
start: ;точка входа программы
mov ax,data ;загрузка в
регистр DS значения
mov ds,ax ;соответствующего положению
mov dx,offset string ;загрузка положения строки
mov ah,09h ;обращение за воспроизведением
int 21h ;строки
mov ah,4ch ;вызов функции завершения
int 21h
code ends
stack segment stack ;стековый сегмент программы
DW 64 DUP(?) ;определение области стека
stack ends
end start ;обозначение конца и определе
;ние начала
Слайд 61
text segment
assume Cs:text,Ds:data
begin:
mov Ax,data
mov Ds,Ax
mov AH,09h
mov Dx,offset string
int 21h
mov
AH,4Ch
mov AL,0
int 21h
text ends
data segment
string db "start!$"
data ends
stack segment stack
db 256 dup (0)
stack ends
end begin ;
обозначение конца и определе ;ние начала
Слайд 62Программа на Fasm
org 100h
; расположения в памяти : 100h
start: ; Метка старота программы (не ;обязательно)
mov ah,9 ; Функция ДОС
mov dx,hello ; для вывода строки
int 21h ; на экран
mov ah,0 ; Функция БИОС
int 16h ; Ожидание нажатия клавиши
int 20h ; завершение программы
ret ; Возврат из процедуры start
hello db 'Hello world!',13,10,24h
Слайд 64
http://placeprog.com/blogs/assembler/asembler-dlja-win32-okno.html