Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод.Указания к Лаб.Раб по АВС.doc
Скачиваний:
10
Добавлен:
05.03.2016
Размер:
2.2 Mб
Скачать

Общие сведения

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

  • Add – сложение;

  • Adc – сложение с учетом предыдущего переноса;

  • Sub – вычитание;

  • Sbb – вычитание с учетом предыдущего займа;

  • Mul – умножение данных без знака (т.е. все биты операндов рассматриваются командой как биты данных);

  • Imul – умножение знаковых данных (т.е. старший бит операндов рассматривается командой как знаковый бит);

  • Div – деление данных без знака;

  • Idiv – деление знаковых данных;

  • Incувеличение операнда на единицу;

  • Dec – уменьшение операнда на единицу;

  • Cbwпреобразование байта в слово;

  • Cwdпреобразование слова в двойное слово;

  • Cmpcравнение операндов;

  • Negизменение знака операнда.

Задание

  1. Внимательно изучить работу команд двоичной целочисленной арифметики по конспекту и электронной документации.

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

  3. Программу выполнить по шагам в TD, анализируя состояние используемых регистров после выполнения каждой команды, области памяти, в которую записываются результаты вычислений и состояние флагового регистра.

Варианты заданий

№ варианта

Выражение

1

( ( 253 + 255 ) / 127 – 9 ) * 397

2

144 / 2 + (( 39 – 12 ) * 14 )/ 3

3

62352 / 36 + ( 987 – 750 ) * ( - 94 )

4

( 4400+3100 ) – ( 6500-700 ) / ( -50 )

5

( 584 – 399 + 256 ) * 300 + 350 / 70

6

( 357 – 400 ) * ( -52 ) + ( 147 + 367 ) / 257

7

144 * ( - 39 ) + ( 728 + 172 ) / 300

8

( 75389 *24 + 150 ) / 9

9

( 290 – 350 ) / (- 10 ) – ( 896 / 448 ) * 4 + 156

10

( 924 – 148 ) / 97 + ( 250 * 397 ) * 248

11

( 584 – 256 ) * ( -7 ) + ( 218 + 679 ) / 299

12

( 1708 / 427 ) * ( - 5 ) + ( 357 – 400 ) * 352

13

280 / ( - 70 ) + ( 987 + 750 ) * 450

14

6358 / 2 + ( 350 – 700 ) * 59

15

( 728 + 156 ) / 442 + 150 * ( - 3 )

16

144 / 48 + ( 350 – 700 ) * 59

17

( 48 – 12 ) * 260 + ( 60 – 72 ) / ( - 4 )

18

850 * 39 + ( 170 – 18 ) / ( - 38 )

19

( 728 + 150 ) * 5 – 67500 / 450

20

( 880 + 970 ) / 50 – ( 875 / 125 ) * 7

21

( 359 – 120 ) * 25 – 192 / 64 + 1116 / 279

22

( 470+550 ) / ( 243+777 )+( 100-140 )

Продолжение таблицы вариантов заданий

23

( 13711 + 497 ) / ( - 128 ) + ( 540 / ( 257 – 149 )) * ( - 32 )

24

( 139 – 277 ) * ( -255 ) + 688 / ( 700 –528 )

25

45500 / 325 – ( 397 + 288 ) * ( -5 )

26

( 115 – 250 ) * ( -3 ) + 55199 / 289

27

362 + ( 125 – 55 ) / 35 + 308 / (( 25 – 14 ) * 2 )

28

243 / ( -27 ) + 55440 / 720 * ( 140 – 35 )

29

( 535 – 628 ) * 22 – 407 / ( - 37 )

30

257 * ( - 9 ) + ( 241 + 335 ) / 48

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

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

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

Исходные данные

Их шестнадцатеричный эквивалент

590

2 4E h

770

3 02 h

54

36 h

75

48 h

20

14 h

950

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