Архитектура ЭВМ Практика 3. Линейные программы на языке ассемблера.
Пример программы
Формат команды ассемблера Любая команда на языке ассемблера соответствует следующему формату: [метка] [команда/директива] [операнды][;комментарии] Примеры: СтрокаМетка Команда/ директива ОперандыКомментарии lbl1: mov AX,BX ;комментlbl1movAX, BXкоммент sum DW 3 ;сохранить 3 в sumsumDW3сохранить 3 в sum begin:begin-нет- add ax,[_a]-нет-addax, [_a]-нет- ;прибавить к AX значение\ по адресу [_a] -нет- прибавить к AX значение по адресу [_a]
Метка Меткой называется символьное обозначение адреса, по которому начинается команда. Необязательное символическое имя команды или директивы. Метки фактически определяют смещения соответствующих слов в областях данных или кода. Если кроме метки в строке нет директив, то она обязана заканчиваться двоеточием. В этом случае она задает адрес команды или директивы в следующей строке программы.
Примеры меток В нашей программе используются следующие метки: x,y,z,u,w,v,begin.
Команды и директивы Команды и директивы определяют действия, которые должны быть выполнены в строке с ассемблерным кодом. Мнемоника каждой команды (int, mov, add) позволяет определить, какой машинный код необходимо загрузить в микропроцессор для выполнения. Если в строке указана директива, то генерация машинных кодов не производится.
Примеры команд и директив В нашей программе используются следующие директивы:.MODEL,.STACK,.DATA,.CODE, DW. В нашей программе используются следующие команды: MOV, IMUL, SUB, CWD, IDIV, ADD, INT
Операнды Определяют непосредственные значения, регистры, фрагменты памяти и другие элементы, которыми манипулируют команды. Количество операндов однозначно определяется кодом команды: push ax – один операнд; mov ax, bx – два операнда.
Типы операндов Регистровые – задаются как имя_регистра или [имя_регистра]. имя_регистра – значение операнда хранится в указанном регистре. Например: push ax ;заносит в стек значение регистра AX [имя_регистра] – значение операнда хранится в памяти, адрес которой хранится в указанном регистре. Например: mov ax,[bx] ;сохранить в AX значение из памяти ;по адресу, хранящемуся в регистре BX
Типы операндов (2) Константы – неизменяемые значения: mov AX, 1000 Выражения – это формулы, которые после своего вычисления дают константы. В выражениях можно использовать различные арифметические (унарные и бинарные), сдвиговые, логические, и другие операторы. Метки – позволяют обращаться к нужному элементу памяти, продолжить выполнение программы с заданной строки и т.п.
Пример программы Вводные комментарии и директивы Область определения данных Область определения кода программы
Вводные директивы:.MODEL.MODEL – определение используемой модели памяти: tiny - код и данные вместе занимают 1 сегмент до 64 килобайт; small – код занимает 1 сегмент до 64 килобайт, данные занимают 1 сегмент до 64 килобайт; compact, medium, large, huge – для более больших программ.
Вводные директивы:.STACK.STACK – определение размера стека. Например,.STACK 100h определяет, что в программе будет использоваться стек размером 256 (100h) байт. После использования данной директивы, в регистр SS загружается сегментный адрес области стека, а в SP заносится значение 100h. Директива.STACK без параметра определяет размер стека равным 1024 (400h) байт.
Директива.DATA.DATA служит для задания начала сегмента данных программы. Адрес сегмента автоматически заносится в Поэтому, чтобы получить доступ к данным в сегменте.DATA необходимо занести в базовый сегментный регистр DS значение этого символа: mov mov DS, AX
Объявление данных Для объявления данных используются следующие директивы: DB – 1 байт для данного DW – 2 байта (слово) для данного или смещения в памяти; DD – 4 байта (двойное слово) для данного или адреса в памяти. DF, DP – 6-и байтовый указатель; DQ – 8 байт для данного DT – 10 байт для данного.
Объявление данных Типы данных: Числа десятичные – числа без суффикса или с суффиксом d ( 10, 128d ); двоичные – c суффиксом b ( 101b, 1101b ); восьмеричные –с суффиксом o или q ( 125o, 37q ); шестнадцатеричные – c суффиксом h и должны начинаться с цифры от 0 до 9 ( 0AAh, 553h ). Вещественные числа задаются с помощью директив DD, DQ, DT.
Объявление данных Типы данных: Символы Для получения ASCII-кода символа его надо заключить в одинарные ( ) или двойные ( ) кавычки. Например: my_byte DB D ;в выделенный байт записан ;ASCII-код символа D
Команда mov mov - это основная команда пересылки данных. Она реализует самые разнообразные варианты пересылки. Командой mov нельзя осуществить пересылку из одной области памяти в другую. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения. Например (y := x): mov ax,x mov y,ax mov,
Команда mov (продолжение) Нельзя загрузить в сегментный регистр значение непосредственно из памяти. Поэтому для выполнения такой загрузки нужно использовать промежуточный объект: mov mov ds,ax Нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр. Выполнить такую пересылку можно, используя в качестве промежуточных все те же регистры общего назначения. Вот пример инициализации регистра es значением из регистра ds: mov ax,ds mov es,ax
Другие команды пересылки данных xchg – команда обмена значений двух данных xchg, lea, Адрес lea – это команда для загрузки эффективного адреса источника в приёмник.
Классификация арифметических команд
Арифметические команды Двоичное сложение: inc - операция инкремента (+1); add, - сложение, результат сохраняется в ; adc, - сложение, с учетом флага переноса cf. Двоичное вычитание: dec - операция декремента (-1); sub, - вычитание, результат сохраняется в ; sbb, - вычитание, с учетом флага переноса cf.
Арифметические команды (2) Двоичное умножение: mul - операция умножения чисел без знака (только положительных): ax := al* или dx:ax := ax * imul - операция умножения чисел со знаком (старший бит – знаковый).
Арифметические команды (3) Двоичное деление: div - операция деления чисел без знака (только положительных): al := ax/ ah := или ax := dx/ax * dx := idiv - операция деления чисел со знаком (старший бит – знаковый);
Команды преобразования данных neg - изменение знака; cbw - операция преобразования байта al в слово ax с учетом знака: ax := 00h+al ;если AL >= 0 ax := FFh+al ;если AL < 0 cwd – преобразование слова ax в двойное слово dx:ax с учетом знака: dx:ax := 0000h+ax ;если AX >= 0 dx:ax := FFFFh+ax ;если AX < 0
Практическое задание Изучить пример программы, производящей арифметические действия с данными. Разработать программу для своего варианта арифметических действий. Протестировать программу. Записать в отчет заданные исходные данные и полученные результаты (в шестнадцатеричной и десятичной системе счисления).
Варианты (c 1 по 6) Вариант ВыражениеТест1Тест2 1 y = 1; w = 4; u = 3; v = 5; z = 2 y = 12; w = -2; u = 2; v = 3; z = y = 2; w = 3; u = 10; v = 5; z = 18 y = 2; w = 3; u = 10; v = -2; z = 18 3 y = 1; w = 4; u = 2; v = 5; z = 3 y = -2; w = 4; u = 2; v = 5; z = 3 4 y = 12; w = 4; u = 8; v = 2; z = 10 y = 12; w = 4; u = 8; v = 2; z = y = 10; w = 8; u = 4; v = 3; z = 2 y = 10; w = 40; u = 4; v = 3; z = 2 6 y = 5; w = 3; u = 2; v = 3; z = 1 y = 5; w = 3; u = -10; v = 3; z = 1
Варианты (c 7 по 12) Вариант ВыражениеТест1Тест2 7 y = 1; w = 5; u = 3; v = 4; z = 2 y = 1; w = -12; u = 3; v = 4; z = 2 8 y = 5; w = 1; u = 3; v = 2; z = 4 y = 15; w = 1; u = 3; v = 2; z = 4 9 y = 2; w = -1; u = 8; v = 5; z = 3 y = 2; w = -1; u = 8; v = 5; z = y = 8; w = 5; u = 4; v = 1; z = 2 y = 8; w = 15; u = 4; v = 1; z = 2 11 y = 12; w = 3; u = 2; v = -2; z = -10 y = 12; w = 3; u = 2; v = -2; z = y = 12; w = 30; u = 20; v = -20; z = -100 y = 12; w = 30; u = 20; v = -20; z = 100
Отчет должен содержать: 1.Номер варианта, условие задачи 2.Текст программы с комментариями. 3.Результат тестирования программы (значения исходных данных и полученные результаты в шестнадцатеричной и десятичной системе счисления).