АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Пример программы работы с командами двоичной арифметики

Читайте также:
  1. I Психологические принципы, задачи и функции социальной работы
  2. I. 1.1. Пример разработки модели задачи технического контроля
  3. I. Задания для самостоятельной работы
  4. I. Задания для самостоятельной работы
  5. I. Задания для самостоятельной работы
  6. I. КУРСОВЫЕ РАБОТЫ
  7. I. ОБЩИЕ ПОЛОЖЕНИЯ ПО ВЫПОЛНЕНИЮ КОНТРОЛЬНОЙ РАБОТЫ
  8. I. ОБЩИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ КУРСОВОЙ РАБОТЫ
  9. I. ОБЩИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ КУРСОВОЙ РАБОТЫ
  10. I. Основы применения программы Excel
  11. II съезд РСДРП. Принятие программы и устава. Возникновение большевизма.
  12. II этап: запуск программы PowerPoint и выбор режима отображения.

Задание: (590-770) * 54 + 950 / (75+20)

 

Для удобства дальнейшего анализа работы программы составим таблицы соответствия данных их шестнадцатеричным значениям.

 

 

Исходные данные Их шестнадцатеричный эквивалент  
  2 4E h  
  3 02 h  
  36 h  
  48 h  
  14 h  
  3 B6 h  
Промежуточные результаты Их шестнадцатеричный эквивалент
(590 – 770) = -180 FF 4C h
(590 – 770) * 54 = - 9720 FFFF DA08 h
(75 + 20) = 95 37 h
950 / (75 + 20) = 10 A h
       

 

 

Результат вычислений Его шестнадцатеричный эквивалент
(590-770) * 54 + 950 / (75+20) FFFF DA12 h

 

Data SEGMENT

IsB DB 54,75,20

IsW DW 590,770,950

PromRezB DB 2 dup (0)

PromRezW DW 5 dup (0)

Data ENDS

Code SEGMENT

ASSUME DS:Data,CS:Code,SS:Stack1,ES:Data

Start:; Настройка регистра DS на начало сегмента данных нашей программы

mov AX,Data

mov DS,AX

;Вычисление значения (590-770)

mov AX,IsW; загрузка на регистр AX значения 590

sub AX,isW+2;вычитание из AX значения 770.

;Результат будет на AX

mov PromRezW,AX; запись результата вычитания в область

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

 

; Вычисление значения (590-770)*54

 

;Умножение в данной ситуации должно быть знаковым

;(т.е. выполнять его будем командой IMUL),

;так как результат выполнения действия вычитания - отрицательное значение.

;Кроме того, мы должны учесть, что в данном умножении у нас;участвуют

;одно байтовое значение (54) и одно слово (-180),

;но так как команда умножения выполняет обработку данных

;только по схемам:

;AL * байт -> результат на AX или

;AX * слово -> результат на регистровой паре DX:AX,

;то мы должны байтовое значение (54) использовать как словесное,

;для этого 54 мы запишем на BL (младший байт регистра BX)

;а старший байт регистра BX - BH - обнулим при помощи команды xor.

;Значение результата вычитания у нас уже находиться на AX

;после последнего действия

mov BL,IsB;загрузка на BL значения 54

xor BH,BH;обнуление старшего байта регистра BH

imul BX;результат умножения будет на регистровой паре DX:AX

;сохранение в сегменте данных младшей части результата

mov PromRezW+2,AX

;сохранение в сегменте данных старшей части результата

mov PromRezW+4,DX

 

;Вычисление значения (75+20)

mov BL,IsB+1;запись на BL исходного значения 75

add BL,IsB+2;суммирование его с исходным значением 20

mov PromRezB,BL;сохранение результата в сегменте

; данных

 

;Выполнение действия (950/(75+20))

;Так как и делимое и делитель числа положительные,

;то для деления выбираем команду целочисленного без знакового деления DIV

;Деление на ассемблере выполняется по следующим схемам:

;AX/байт -> результат распределяется так:

;в AL - частное, в AH - остаток

;или DX:AX/слово -> результат распределяется так:

;в AX - частное, в DX - остаток.

;Так как в нашей ситуации длина делимого (950) слово, а делителя байт (95),

;то у нас будет первый вариант схемы выполнения деления

;Загружаем на AX делимое

mov AX,IsW+4

;делитель в данный момент у нас уже на регистре BL

;после выполнения действия сложения (вычисление значения знаменателя)

;Делим

div BL

;Сохраняем частное в сегменте данных

mov PromRezB,AL

;Остаток - равен нулю

;Вычисление результата = (590-770)*54 + 950/(75+20)

 

;Суммирование промежуточных результатов вычисления двух частей выражения

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

;суммирование будем выполнять так: младшее слово с байтом,

;приведенным к длине слова

mov CX,PromRezW+2;загрузка на CX первого слагаемого

xor AH,AH;обнуление старшего байта AX

;(там сейчас находится остаток от деления)

add CX,AX;суммируем, результат будет на CX

mov PromRezW+6,CX

;переписываем старшую часть результата

;(она сейчас в ячейке памяти по адресу PromRez+4

;и на регистре DX, так как после умножения мы этот регистр не использовали)

mov PromRezW+8,DX

 

;Завершаем программу

mov ah,4ch

int 21h

code SEGMENT

stack1 segment 'stack'

DB 80 dup (0)

stack1 ends

end start

Содержание отчета

Отчет по лабораторной работе должен содержать:

 

1) титульный лист;

2) тему и цель работы;

3) листинг программы;

4) таблицу, содержащую исходные данные, промежуточные значения и результат вычисления примера в десятичном и шестнадцатеричном форматах (для быстрой проверки);

5) дамп памяти после выполнения программы;

6) выводы по работе.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.)