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

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

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

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

Как видим, команд условного перехода достаточно много, поэтому понятно, почему для них реализован только один формат – близкий короткий относительный переход. Реализация других форматов команд условного перехода привела бы к резкому увеличению числа команд в языке машины и, как следствие, к усложнению центрального процессора и росту объёма программ. В то же время наличие только одного формата команд условного перехода может приводить к плохому стилю программирования. Пусть, например, надо реализовать на Ассемблере условный оператор языка Паскаль

if X>Y then goto L;

Соответствующий фрагмент на языке Ассемблера, реализующий этот оператор для знаковых X,Y

mov ax,X

cmp ax,Y

jg L

. . .

L:

может быть неверным, если расстояние между меткой и командой условного перехода велико (не помещается в байт). В таком случае придётся использовать такой фрагмент на Ассемблере со вспомогательной меткой L1 и вспомогательной командой безусловного перехода:

mov ax,X

cmp ax,Y

jle L1

jmp L

L1:

. . .

L:

Таким образом, на самом деле мы вынуждены реализовывать такой фрагмент программы на языке Паскаль:

if X<=Y then goto L1; goto L; L1:;

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

В качестве примера использования команд условного перехода рассмотрим программу, которая вводит знаковое число A в формате слова и вычисляет значение X по формуле

include io.asm

; файл с макроопределениями для макрокоманд ввода-вывода

data segment

A dw ?

X dw ?

Diagn db ′Ошибка – большое значение!$′

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 ax,A ; ax := A

mov bx,ax ; bx := A

inc ax ; ax := A+1

jo Error

cmp bx,2 ; Сравнение A и 2

jle L1 ; Вниз по первой ветви вычисления X

dec bx ; bx := A-1

jo Error

imul bx ; (dx,ax):=(A+1)*(A-1)

jo Error ; Произведение (A+1)*(A-1) не помещается в ax

L: mov X,ax ; Результат берётся только из ax

outint X; Вывод результата

newline

finish

L1: jl L2; Вниз по второй ветви вычисления X

mov ax,4

jmp L; На вывод результата

L2: mov bx,7; Третья ветвь вычисления X

cwd ; (dx,ax):= длинное (A+1) – иначе нельзя!

idiv bx; dx:=(A+1) mod 7, ax:=(A+1) div 7

mov ax,dx

jmp L; На вывод результата

Error:mov dx,offset Diagn

outstr

newline

finish

code ends

end start

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

Для увеличения и уменьшения операнда на единицу мы использовали команды

inc op1 и dec op1

Здесь op1 может иметь формат r8, r16, m8 и m16. Например, команда inc ax эквивалентна команде add ax,1 , но не меняет флага CF. Таким образом, после этих команд нельзя проверить флаг переполнения, чтобы определить, правильно ли выполнились такие операции над беззнаковыми числами.

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

L2: mov bh,7; Третья ветвь вычисления X

idiv bh; ah:=(A+1) mod 7, al:=(A+1) div 7

может привести к ошибке. Здесь остаток от деления (A+1) на число 7 всегда поместится в регистр ah, однако частное (A+1) div 7 может не поместиться в регистр al (пусть A=27999, тогда (A+1) div 7 = 4000 – не поместится в регистр al).

При использовании команд условного перехода мы предполагали, что расстояние от точки перехода да нужной метки небольшое (формата i8), если это не так, то программа Ассемблера выдаст нам соответствующую диагностику об ошибке и нам придётся использовать "плохой стиль программирования", как объяснялось выше. В нашей программе это может случиться только тогда, когда суммарный размер кода, подставляемого вместо макрокоманд outint и finish, будет больше 128 байт (обязательно понять это!).

7.6.3. Команды цикла

Для организации циклов на Ассемблере вполне можно использовать команды условного перехода. Например, цикл языка Паскаль с предусловием while X<0 do S; можно реализовать в виде следующего фрагмента на Ассемблере

L: cmp X,0; Сравнить X с нулём

jge L1

; Здесь будет оператор S

jmp L

L1: . . .

Оператор цикла с постусловием repeat S1; S2;. . .Sk until X<0; можно реализовать в виде фрагмента на Ассемблере

L: ; S1

; S2

. . .

; Sk

cmp X,0; Сравнить X с нулём

jge L

. . .

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

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

loop L; Метка L заменится на операнд i8

использует неявный операнд – регистр CX и её выполнение может быть так описано с использованием Паскаля:

Dec(CX); {Это часть команды loop, поэтому флаги не меняются!}

if CX<>0 then goto L;

Как видим, регистр CX (который так и называется регистром счётчиком цикла – loop counter), используется этой командой именно как параметр цикла. Лучше всего эта команда цикла подходит для реализации цикла с параметром языка Паскаль вида

for CX:=N downto 1 do S;

Этот оператор можно эффективно реализовать таким фрагментом на Ассемблере:

mov CX,N

jcxz L1

L: . . .; Тело цикла –

. . .; оператор S

loop L

L1: . . .

Обратите внимание, так как цикл с параметром языка Паскаль по существу является циклом с предусловием, то до начала его выполнение проверяется исчерпание значений для параметра цикла с помощью команды условного перехода jcxz L1 , которая именно для этого и была введена в язык машины. Ещё раз напоминаем, что команды циклов не меняют флагов.

Описанная выше команда цикла выполняет тело цикла ровно N раз, где N – беззнаковое число, занесённое в регистр-счётчик цикла CX перед началом цикла. К сожалению, никакой другой регистр нельзя использовать для этой цели (т.к. это неявный параметр команды цикла). Кроме того, в приведённом выше примере реализации цикла тело этого не может быть слишком большим, иначе команда loop L не сможет передать управление на метку L.

В качестве примера использования команды цикла решим следующую задачу. Требуется ввести беззнаковое число N<=500, затем ввести N знаковых целых чисел и вывести сумму тех из них, которые принадлежат диапазону –2000..5000. Можно предложить следующее решение этой задачи.

include io.asm

; файл с макроопределениями для макрокоманд ввода-вывода

data segment

N dw ?

S dw 0; Начальное значение суммы = 0

T1 db ′Введите N<=500 $′

T2 db ′Ошибка – большое N!$′

T3 db ′Вводите целые числа′,10,13,′$′

T4 db ′Ошибка – большая сумма!$′

data ends

stack segment stack

dw 64 dup (?)

stack ends

code segment

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

start:mov ax,data

mov ds,ax

mov dx, offset T1; Приглашение к вводу

outstr

inint N

cmp N,500

jbe L1

mov dx, offset T2; Диагностика от ошибке

Err: outstr

newline

finish

L1: mov cx,N; Счётчик цикла

jcxz Pech; На печать результата

mov dx,offset T3; Приглашение к вводу

outstr

newline

L2: inint ax; Ввод очередного числа

cmp ax,-2000

jl L3

cmp ax,5000

jg L3; Проверка диапазона

add S,ax; Суммирование

jno L3; Проверка на переполнение S

mov dx,offset T4

jmp Err

L3: loop L2

Pech: outch ′S′

outch ′=′

outint S

newline

finish

code ends

end start

В качестве ещё одного примера рассмотрим использование циклов при обработке массивов. Пусть необходимо составить программу для решения следующей задачи. Задана константа N=20000, надо ввести массивы X и Y по N беззнаковых чисел в каждом массиве и вычислить выражение

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

include io.asm

N equ 20000; Аналог Const N=20000; Паскаля

data1 segment

T1 db ′Вводите числа массива $′

T2 db ′Сумма = $′

T3 db ′Ошибка – большое значение!′,10,13,′$′

S dw 0; искомая сумма

X dw N dup (?); 2*N байт

data1 ends

data2 segment

Y dw N dup (?); 2*N байт

data2 ends

st segment stack

dw 64 dup(?)

st ends

code segment

assume cs:code,ds:data1,es:date2,ss:st

begin_of_program:

mov ax,data1

mov ds,ax; ds – на начало data1

mov ax,data2

mov es,ax; es – на начало data2

mov dx, offset T1; Приглашение к вводу

outstr

outch ′X′

newline

mov cx,N; счётчик цикла

mov bx,0; индекс массива

L1: inint X[bx];ввод очередного элемента X[i]

add bx,2; увеличение индекса, это i:=i+1

loop L1

outstr; Приглашение к вводу

outch ′Y′

newline

mov cx,N; счётчик цикла

mov bx,0; индекс массива

L2: inint ax

mov Y[bx],ax; ввод очередного элемента es:Y[bx]

add bx,2; увеличение индекса

loop L2

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

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

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

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