Главная » Просмотр файлов » В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования

В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования (1110549), страница 11

Файл №1110549 В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования (В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования) 11 страницаВ.Г. Баула - Введение в архитектуру ЭВМ и системы программирования (1110549) страница 112019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 11)

будет читать на регистр ax слово, второй байт которого располагается в конце переменной B, а первый – в начале переменной C (помним о "перевёрнутом" хранении слов в памяти!). Поэтому следует быть осторожными и не считать A, B и C отдельными, "независимыми" переменными в смысле языка Паскаль, это просто именованные области памяти. Разумеется, в понятно написанной программе эти области используются так, как они описаны с помощью присвоенных им имён.

Предложение

D dw 20 dup (?)

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

  • Директивы или команды Ассемблеру. Эти предложения, как уже упоминалось, не порождают в машинной программе никакого кода, т.е. команд или переменных (редким исключением является директива include, о которой мы будем говорить при написании полных программ). Директивы используются программистом для того, чтобы давать программе Ассемблер определённые указания, управлять работой Ассемблера при компиляции (переводе) программы на язык машины. В качестве примера рассмотрим директивы объявления начала и конца описания сегмента с именем A:

A segment

...

A ends

Частным случаем директивы является и предложение-метка, она приписывает имя (метку) следующему за ней предложению. Так, в приведённом ниже примере метка Next_Statement_Name является именем следующего за ней предложения, таким образом, у этого предложения две метки:

Next_Statement_Name:

L: mov ax,2

  • Макрокоманды. Этот класс предложений Ассемблера относится к макросредствам языка, и будут подробно изучаться далее в нашем курсе. Пока лишь скажем, что на место макрокоманды по определённым правилам подставляется некоторый набор (возможно и пустой) предложений Ассемблера.

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

[<метка>[:]] КОП [<операнды>] [; комментарий]

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

В очень редких случаях предложения языка Ассемблера имеют другую структуру, например, директива присваивания значения переменной периода генерации (с этими переменными мы познакомимся при изучении макросредств языка):

K = K+1

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

; это строка-комментарий

7.4. Пример полной программы на Ассемблере

Прежде, чем написать нашу первую полную программу на Ассемблере, нам необходимо научиться выполнять операции ввода/вывода, без которых ни одна сколько-нибудь серьёзная программа обойтись не может. В самом языке машины, в отличие от языка нашей учебной машины УМ-3, нет команда ввода/вывода,1 чтобы, например, ввести целое число, необходима достаточно большая программа на машинном языке.

Для организации ввода/вывода мы в наших примерах будем использовать макрокоманды из учебника [5]. Вместо каждой макрокоманды Ассемблер будет подставлять соответствующий этой макрокоманде набор команд и констант (этот набор, как мы узнаем позже, называется макрорасшире­нием для макрокоманды).

Нам понадобятся следующие макрокоманды ввода/вывода.

  • Макрокоманда вывода символа на экран

outch op1

где операнд op1 может быть в формате i8, r8 или m8. Значение операнда трактуется как код символа, этот символ выводится в текущую позицию экрана. Для задания кода символа удобно использовать символьную константу языка Ассемблер, например, ′A′. Такая константа преобразуется программой Ассемблера именно в код этого символа. Например, outch ′*′ выведет символ звёздочки на место курсора.

  • Макрокоманда ввода символа с клавиатуры

inch op1

где операнд op1 может быть в формате r8 или m8. Код введённого символа записывается в место памяти, определяемое операндом.

  • Макрокоманды вывода на экран целого значения

outint op1[,op2]

outword op1[,op2]

Здесь, как всегда, квадратные скобки говорят о том, что второй операнд может быть опущен. В качестве первого операнда op1 можно использовать i16, r16 или m16, а второго – i8, r8 или m8. Действие макрокоманды outint op1,op2 полностью эквивалентно процедуре вывода языка Паскаль write(op1:op2), а действие макрокоманды с именем outword отличается только тем, что первый операнд трактуется как беззнаковое (неотрицательное) число.

  • Макрокоманда ввода целого числа

inint op1

где операнд op1 может иметь формат r16 или m16, производит ввод с клавиатуры на место первого операнда целого значения из диапазона –215..+216. Особо отметим, что операнды форматов r8 и m8 недопустимы.

  • Макрокоманда без параметров

newline

предназначена для перехода курсора к началу следующей строки экрана и эквивалентна вызову процедуры без параметров writeln языка Паскаль. Этого же эффекта можно достичь, если вывести на экран служебные символы с кодами 10 и 13, т.е. выполнить, например, макрокоманды

outch 10

outch 13

  • Макрокоманда без параметров

flush

предназначена для очистки буфера ввода и эквивалентна вызову процедуры без параметров readln языка Паскаль.

  • Макрокоманда вывода на экран строки текста

outstr

Эта макрокоманда выводит на экран строку текста из того сегмента, на который указывает сегментный регистр DS, причём адрес начала этой строки в сегменте должен находится в регистре DX. Таким образом, физический адрес начала выводимого текста определяется по формуле

Афиз = (DS*16 + DX)mod 220

Заданный таким образом адрес принято записывать в виде так называемой адресной пары <DS,DX>. В качестве признака конца выводимой строки символов должен быть задан символ $ (он рассматривается как служебный признак конца и сам не выводится). Например, если в сегменте данных есть текст

Data segment

. . .

T db ′Текст для вывода на экран$’

. . .

data ends

то для вывода этого текста на экран можно выполнить следующий фрагмент программы

. . .

mov DX,offset T; DX:=адрес T

outstr

. . .

Рассмотрим теперь пример простой полной программы на Ассемблере. Эта программа должна вводить значение целой переменной A и реализовывать оператор присваивания (в смысле языка Паскаль)

X := (2*A - 241 div (A+B)2) mod 7

где B – параметр, т.е. значение, которое не вводится, а задаваётся в самой программе. Пусть A, B и С – знаковые целые величины, описанные в сегменте данных так:

A dw ?

B db –8; это параметр, заданный программистом

X dw ?

Вообще говоря, результат, заносимый в переменную X короткий (это остаток от деления на 7), однако мы выбрали для X формат слова, т.к. его надо выдавать в качестве результата, а макрокоманда outint может выводить только длинные целые числа.

Наша программа будет содержать три сегмента с именами data, code и stack и выглядеть следующим образом:

include io.asm

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

; для макрокоманд ввода-вывода

data segment

A dw ?

B db -8

X dw ?

Data ends

stack segment stack

db 128 dup (?)

stack ends

code segment

assume cs:code, ds:data, ss:stack

start:mov ax,data; это команда формата r16,i16

mov ds,ax ; загрузка сегментного регистра DS

inint A ; макрокоманда ввода целого числа

mov bx,A ; bx := A

mov al,B ; al := B

cbw ; ax := длинное B

add ax,bx ; ax := B+A=A+B

add bx,bx ; bx := 2*A

imul ax ; (dx,ax) := (A+B)2

mov cx,ax ; cx := младшая часть(A+B)2

mov ax,241

cwd ; <dx,ax> := сверхдлинное 241

idiv cx ; ax := 241 div (A+B)2 , dx := 241 mod (A+B)2

sub bx,ax ; bx := 2*A - 241 div (A+B)2

mov ax,bx

cwd

mov bx,7

idiv bx ; dx := (2*A - 241 div (A+B)2) mod 7

mov X,dx

outint X

finish

code ends

end start

Прокомментируем текст нашей программы. Во-первых, заметим, что сегмент стека мы нигде явно не используем, однако он необходим в любой программе. Как мы узнаем далее из нашего курса, во время выполнения любой программы возможно автоматическое (без нашего ведома) переключение на выполнение некоторой другой программы, при этом используется сегмент стека. Подробно этот вопрос мы рассмотрим при изучении прерываний.

В начале сегмента кода расположена директива assume, она говорит программе Ассемблера, на какие сегменты будут указывать соответствующие сегментные регистры при выполнении команд, обращающихся к этим сегментам. Сама эта директива не меняет значения ни одного сегментного регистра, подробно про неё необходимо прочитать в учебнике [5].

Заметим, что сегментные регистры SS и CS должны быть загружены перед выполнением самой первой команды нашей программы. Ясно, что сама наша программа этого сделать не в состоянии, так как для этого необходимо выполнить хотя бы одну команду, что требует доступа к сегменту кода, и, в свою очередь, уже установленного на этот сегмент регистра CS. Получается замкнутый круг, и единственным решением будет попросить какую-то другую программу загрузить значения этих регистров, перед вызовом нашей программы. Как мы потом увидим, эту операцию будет делать служебная программа, которая называется загрузчиком.

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

mov ds,data; формат SR,i16 такого формата нет!

Пусть, например, при счёте нашей программы сегмент данных будет располагаться, начиная с адреса 10000010 оперативной памяти. Тогда команда

mov ax,data

будет во время счёта иметь вид

mov ax,6250 ; 100000 div 16 = 6250

Макрокоманда

inint A; макрокоманда ввода целого числа

вводит значение целого числа в переменную A.

Далее начнём непосредственное вычисление правой части оператора присваивания. Задача усложняется тем, что величины A и B имеют разную длину и непосредственно складывать их нельзя. Приходится командами

mov al,B ; al := B

cbw ; ax := длинное B

преобразовать короткое целое B, которое сейчас находится на регистре al, в длинное целое на регистре ax. Далее вычисляется значение выражения (A+B)2 и можно приступать к выполнению деления. Так как делитель является длинным целым числом (мы поместили его на регистр cx), то необходимо применить операцию длинного деления, для чего делимое (число 241 на регистре ax) командой

cwd

преобразуем в сверхдлинное целое и помещаем на два регистра (dx,ax). Вот теперь всё готово для команды целочисленного деления

idiv cx; ax:= 241 div (A+B)2 , dx:= 241 mod (A+B)2

Далее мы присваиваем остаток от деления (он в регистре dx) переменной X и выводим значение этой переменной по макрокоманде

outint X

которая эквивалентна процедуре WriteLn(X) языка Паскаль. Последним предложением в сегменте кода является макрокоманда

finish

Эта макрокоманда заканчивает выполнение нашей программы, она эквивалентна выходу программы на Паскале на конечный end.

И, наконец, директива

end start

заканчивает описание всего модуля на Ассемблере. Обратите внимание на параметр этой директивы – метку start. Она указывает входную точку программы, т.е. её первую выполняемую команду программы.

Характеристики

Тип файла
Документ
Размер
1,73 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6508
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее