Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






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




Задание: (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) выводы по работе.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных