Сист. прогр. Ч2 (Методические указания к выполнению лабораторных работ по СПО), страница 4

2018-01-12СтудИзба

Описание файла

Файл "Сист. прогр. Ч2" внутри архива находится в следующих папках: Методические указания к выполнению лабораторных работ по СПО, сист прогр лабы. Документ из архива "Методические указания к выполнению лабораторных работ по СПО", который расположен в категории "". Всё это находится в предмете "операционные системы" из 7 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "операционные системы" в общих файлах.

Онлайн просмотр документа "Сист. прогр. Ч2"

Текст 4 страницы из документа "Сист. прогр. Ч2"

CALL С 1 OMUL ; Вызвать умнож. MUL

CALL D10IMUL ; Вызвать умнож. IMUL

RET

MAIN ENDP

; Пример умножения MUL:

C10MUL PROC

MOV AL, BYTE1 ;Байт * байт

MUL BYTE2 ; произведение в АХ

MOV AX, WORD1 ;Слово * слово

MUL WORD2 ; произведение в DХ : АХ

MOV AL, BYTE1 ;Байт * слово

SUB AH, AH ; расшир. множ. в АН

MUL WORD1 ; произведение в DX:AX

RET

C10MUL ENDP

; Пример умножения IMUL:

D10IMUL PROC

MOV AL, BYTE1 ; байт * байт

IMUL BYTE2 ;произведение в АХ

MOV AX, WORD1 ; Слово * слово

IMUL WORD2 ;произведение в DХ:АХ

MOV AL, BYTE1 ; Байт * слово

CBW ; расшир. множ. в АН

IMUL WORD1 ; произведение в DX:AX

RET

D10IMUL ENDP

CODESG ENDS

END BEGIN

Рис.10.3. Беззнаковое и знаковое умножение

Первый пример команды IMUL перемножает 80Н (отрицательное число) на 40Н (положительное число). Произведение Е000 получается в регистре АХ. Используя те же данные, команда MUL дает в результате 2000, так что можно видеть разницу е использовании команд MUL и IMUL. Команда MUL рассматривает 80Н как + 128, а команда IMUL - как -128. В результате умножения 128 на +64 получается -8192 или шестнадцатиричное Е000. (Попробуйте преобразовать Е000 в десятичный формат.)

Второй пример команды IMUL перемножает 8000Н (отрицательное значение) на 2000Н (положительное значение). Произведение F0000000 получается в регистрах DX:AX и представляет собой отрицательное значение.

Третий пример команды IMUL перед умножением выполняет расширение байта BYTE1 до размеров слова в регистре АХ. Так как значения предполагаются знаковые, то в примере используется команда CBW для перевода левого знакового бита в регистр АН: шестнадцатиричное 80 в регистре АL превращается в FF80 в регистре АХ. Поскольку множитель в слове WORD1 имеет также отрицательное значение, то произведение будет положительным. В самом деле, 00400000Н в регистрах DX:AX - такой же результат, как и в случае умножения командой MUL, которая предполагала положительные сомножители.

Таким образом, если множимое и множитель имеют одинаковый знаковый бит, то команды MUL и IMUL генерируют одинаковый результат. Но если сомножители имеют разные знаковые биты, то команда MUL вырабатывает положительный результат умножения, а команда IMUL - отрицательный.

Можно обнаружить это, используя отладчик DEBUG для трассировки примеров.

Многословное умножение.

Обычно умножение бывает двух типов: умножение байта на байт и умножение слова на слово. Как было показано, максимальное знаковое значение в слове + 32767. Умножение больших чисел требует выполнения некоторых дополнительных действий. Рассматриваемый подход предполагает умножение каждого слова отдельно и затем сложение полученных результатов. Рассмотрим следующее умножение в десятичном формате: 1365 х 12 = 16830

Представим, что десятичная арифметика может умножать только двузначные числа. Тогда можно умножить 13 и 65 на 12 раздельно:

13 65

х12 х12

26 130

13 65

156 780

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

15600

+780

16380

Ассемблерная программа использует аналогичную технику, за исключением того, что данные имеют размерность слов (четыре цифры) в шестнадцатеричном формате.

Повышение эффективности умножения. При умножении на степень числа 2 (2,4,8 и т.д.) более эффективен сдвиг влево на требуемое число битов. Сдвиг более чем на 1 требует загрузки счетчика сдвига в регистр CL.

Повышение эффективности умножения. При умножении на степень числа 2 (2,4,8 и т.д.) более эффективен сдвиг влево на требуемое число битов. Сдвиг более чем на 1 требует загрузки счетчика сдвига в регистр CL.

Умножение двойного слова на слово. Процедура E10XMUL на рис.10.4 умножает двойное слово на слово. Множимое MULTCND состоит из двух слов, содержащих соответственно 3206Н и 2521Н. Определение данных в виде двух слов (DW) вместо двойного слова (DD) обусловлено необходимостью правильной адресации для команд MOV, пересылающих слова в регистр АХ. Множитель MULTPLR содержит 6400Н. Область для записи произведения PRODUCT состоит из трех слов. Первая команда MUL перемножает MULTPLR и правое слово поля MULTCND; произведение 0Е80 Е400 записывается в PRODUCT + 2 и PRODUCT+4. Вторая команда MUL перемножает MULTPLR и левое слово поля MULTCND, получая в результате 138А 5800. Далее выполняется сложение двух произведений следующим образом:

Произведение 1: 0000 0E80 Е400

Произведение 2: 138A_5800____

Результат: 138A 6680 Е400

Так как первая команда ADD может выработать перенос, то второе сложение выполняется командой сложения с переносом ADC (Add with Carry). В силу обратного представления байтов в словах в процессорах 8086/8088 область PRODUCT в действительности будет содержать значение 8А13 8066 00Е4. Программа предполагает, что первое слово в области PRODUCT имеет начальное значение 0000.

Умножение двойного слова на двойное слово. Умножение двух двойных слов включает следующие четыре операции умножения:

Множимое Множитель
слово 2 х слово 2
слово 2 х слово 1
слово 1 х слово 2
слово 1 х слово 1

TITLE EXDUMUL ; Умножение двойных слов

CODESG SEGMENT PARA ‘Code’

ASSUME CS:CODESG, DS:CODESG, SS:CODESG

ORG 100H

BEGIN: JMP SHORT MAIN

MULTCND DW 3206H ; Элементы данных

DW 2521H

MULTPLR DW 6400H

DW 0A26H

PRODUCT DW 0

DW 0

DW 0

DW 0

MAIN PROC NEAR ;Основная процедура

CALL E10XMUL ;Вызвать 1-е умножение

CALL Z10ZERO ;0чистить произведение

CALL F10XMUL ;Вызвать 2-е умножение

RET

MAIN ENDP

; Умножение дв. слова на слово:

E10XMUL PROC

MOV AX, MULTCND+2 ;Умнож. прав. cл.

MUL MULTPLR ; множимого

MOV PRODUCT+4, AX ;3аписать произв.

MOV PRODUCT+2, DX

MOV AX, MULTCND ;Умножить лев. сл.

MUL MULTPLR ; множимого

ADD PRODUCT+2, AX ;Сложить с полученным ранее

ADC PRODUCT, DX

RET

E10XMUL ENDP

; Перемножение двух двойных слов:

F10XMUL PROC

MOV AX, MULTCND+2 ;Слово-2 множимого

MUL MULTPLR+2 ;* слово-2 множителя

MOV PRODUCT+6, AX ;Сохранить рез.

MOV PRODUCT+4, DX

MOV AX, MULTCND+2 ;Слово-2 Множимогс

MUL MULTPLR ;* слово-1 множителя

ADD PRQDUCT+4 , AX ;Слохить с пред.

ADC PRODUCT+6, DX

ADC PRODUCT, 00 ;Прибавить перенос

MOV AX, MULTCND ;Слово-1 множимого

MUL MULTPLR+2 ;* слово-2 множителя

ADD PRODUCT+4, AX ;Сложить с пред.

ADC PRODUCT+6, DX

ADC PRODUCT, 00 ; Прибавить перенос

MOV AX, MULTCND ;Слово-1 множимого
MUL MULTPLR ;* слово-1 множителя
ADD PRODUCT+2, AX ;Сложить с пред.
ADC PRODUCT,DX
RET

F10XMUL ENDP

; Очистка области результата:

Z10XMUL PROC

MOV PRODUCT,0000

MOV PRODUCT+2,0000

MOV PRODUCT+4,0000

MOV PRODUCT+6,0000

RET

Z10XMUL ENDP

CODESG ENDS

END BEGIN

Рис. 10.4 Многословное умножение

Каждое произведение в регистровой паре DX:AX складывается с соответствующим словом в окончательном результате. Пример такого умножения приведен в процедуре F10XMUL на рис.10.4. Множимое MULTCND содержит 3206 2521, множитель MULTPLR -6400 0А26. Результат заносится в область PRODUCT, состоящую из четырех слов.

Хотя логика умножения двойных слов аналогична умножению двойного слова на слово, имеется одна особенность. После пары команд сложения ADD/ADC используется еще одна команда ADC, которая прибавляет 0 к значению в поле PRODUCT. Это необходимо потому, что первая команда ADC сама может вызвать перенос, который последующие команды могут стереть. Поэтому вторая команда ADC прибавит 0, если переноса нет, и прибавит 1, если перенос есть. Финальная пара команд ADD/ADC не требует дополнительной команды ADC, так как область PRODUCT достаточно велика для генерации окончательного результата и переноса на последнем этапе не будет.

Окончательный результат 138А 687С 8Е5С ССЕ6 получится в поле PRODUCT в обратной последовательности байтов в словах. Выполните трассировку этого примера с помощью отладчика DEBUG.

СДВИГ РЕГИСТРОВОЙ ПАРЫ DX:AX

Следующая подпрограмма может быть полезна для сдвига содержимого регистровой пары DX:AX вправо или влево. Можно придумать более эффективный метод, но данный пример представляет общий подход для любого числа циклов (и

соответственно сдвигов) в регистре СХ. Заметьте, что сдвиг единичного бита за разрядную сетку устанавливает флаг переноса.

Сдвиг влево на 4 бита

MOV СХ, 04

С20: SHL DX,1

SHL AX, 1

ADC DX, 00

LOOP C20

Ниже приведен более эффективный способ для сдвига влево, не требующий организации цикла. В этом примере фактор сдвига записывается в регистр CL. Пример написан для сдвига на 4 бита, но может быть адаптирован для других значений сдвигов:

MOV СL, 04

SHL DX, CL

MOV BL, AH

SHL AX, CL

SHL BL, CL

OR DL, BL

ДЕЛЕНИЕ

Операция деления для беззнаковых данных выполняется командой DIV, а для знаковых - IDIV. Ответственность за подбор подходящей команды лежит на программисте. Существуют две основные операции деления:

Деление слова на байт. Делимое находится в регистре АХ, а делитель - в байте памяти или в однобайтовом регистре. После деления остаток получается в регистре АН, а частное - в AL. Так как однобайтовое частное, очень мало - максимально + 255 (OFFH) для беззнакового деления и + 127 (7FH) для знакового, то данная операция имеет ограниченное использование:

Деление двойного слова на слово. Делимое находится в регистровой паре DX:AX, а делитель - в слове памяти или в регистре. После деления остаток получается в регистре DX, а частное - в регистре АХ. Частное в одном слове допускает

максимальное значение + 65535 (FFFF) для беззнакового деления и + 32767 (7FFF) для знакового:

В единственном операнде команд DIV и IDIV указывается делитель. Рассмотрим следующую команду:

DIV DIVISOR

Если поле DIVISOR определено как байт (DB), то операция предполагает деление слова на байт. Если поле DIVISOR определено как слово (DW), то операция предполагает деление двойного слова на слово.

При делении, например, 13 на 3 получается результат 4 1/3. Частное здесь 4, а остаток - 1. Заметим, что ручной калькулятор (или программа на языке БЕЙСИК) выдает в этом случае результат 4,333... Значение содержит целую часть (4) и дробную часть (,333). Значения 1/3 и ,333... - дробные части, в то время как 1 -остаток от деления.

Беззнаковое деление: команда DIV

Команда DIV делит беззнаковые числа. Первый пример команды DIV делит 2000Н (8092) на 80Н (128). В результате остаток 00 получается в регистре АН, а частное 40Н (64) - в регистре AL.

Во втором примере команды DIV выполняется прежде расширение байта BYTE1 до размеров слова. Так как здесь предполагается беззнаковая величина, то в примере левый бит регистра АН равен нулю. В результате деления остаток - 12Н получается в регистре АН, а частное 05Н - в регистре AL.

Третий пример команды DIV генерирует остаток 1000Н в регистре DX и частное 0080Н в регистре АХ.

В четвертом примере команды , DIV сначала выполняется расширение слова WORD1 до двойного слова в регистровой паре DX:AX. После деления остаток ООООН получится в регистре DX, a частное 0002Н - в регистре АХ.

Знаковое деление: команда IDIV

Команда IDIV (Integer DIVide) выполняет деление знаковых чисел. Первый пример команды IDIV делит 2000Н (положительное число) на 80Н (отрицательное число). Остаток от деления 00Н получается в регистре АН , а частное -0С0Н (-64) - в регистре AL. Команда DIV, используя те же числа, генерирует частное + 64.

Шестнадцатиричные результаты трех остальных примеров деления приведены ниже:

Пример команды IDIV Остаток Частное

2 ЕЕ (-18) FВ (-5)

3 1000 (4096) 0080 (128)

4 0000 0002

Только в примере 4 вырабатывается такой же результат, как и для команды DIV. Таким образом, если делимое и делитель имеют одинаковый знаковый бит, то команды DIV и IDIV генерируют одинаковый результат. Но если делимое и делитель имеют разные знаковые биты, то команда DIV генерирует положительное частное, а команда ID1V - отрицательное частное. Можно обнаружить это, используя отладчик DEBUG для трассировки этих примеров.

Повышение производительности. При делении на степень числа 2 (2, 4 и т.д.) более эффективен сдвиг вправо на требуемое количество битов. В следующих примерах предположим, что делимое находится в регистре АХ:

Деление на 2: SHR AX.1

Деление на 8: MOV CL,3

SHR AX, CL

Переполнения и прерывания

Используя команды DIV и особенно IDIV, очень просто вызвать переполнение. Прерывания приводят (по крайней мере в системе, используемой при тестировании этих программ) к непредсказуемым результатам. В операциях деления предполагается, что частное значительно меньше, чем делимое. Деление на нуль всегда вызывает прерывание. Но деление на 1 генерирует частное, которое равно делимому, что может также легко вызвать прерывание.

Рекомендуется использовать следующее правило: если делитель - байт, то его значение должно быть меньше, чем левый байт (АН) делителя; если делитель - слово, то его значение должно быть меньше, чем левое слово (DX) делителя. Проиллюстрируем данное правило для делителя, равного 1:

Операция деления: Делимое Делитель Частное

Слово на байт: 0123 01 (1) 23

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