Лабораторная работа №6
Задание 1.
Поместите инструкцию RCL BL,1 по адресу 100, занесите в регистр число B7, выполняйте инструкцию циклического сдвига, каждый раз записывая значения флага С и содержимого BL в шестнадцатеричном и двоичном формате в таблицу до восстановления исходного значения регистра.
Полученные искомые значения
|
С |
Значения битов регистра BL |
BL |
|||||||
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
|
NC(0) |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
B7 |
|
CY(1) |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
6E |
|
NC(0) |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
DD |
|
CY(1) |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
BA |
|
CY(1) |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
75 |
|
NC(0) |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
EB |
|
CY(1) |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
D6 |
|
CY(1) |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
AD |
|
CY(1) |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
5B |
|
NC(0) |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
B7 |
Как видно из таблицы, после восьми сдвигов через перенос значение в регистре становится исходным.
Задание 2.
Напишите инструкции, выполнение которых приведет к выводу на экран значения бита переноса в виде цифры (символы 0 и 1, соответствующие коды 30h и 31h).
0B83:0100 B80000 MOV AX,0000
0B83:0103 153000 ADC AX,0030
0B83:0106 88C2 MOV DL,AL
0B83:0108 B402 MOV AH,02
0B83:010A CD21 INT 21
0B83:010C CD20 INT 20
(Файл 62.com)
Задание 3
Напишите программу, которая выводит на экран в двоичном представлении число, записанное в регистре BL.
Примем, что BL=B7h (10110111b), тогда программа примет вид:
0B83:0100 B3B7 MOV BL,B7
0B83:0102 B90800 MOV CX,0008
0B83:0105 D0D3 RCL BL,1
0B83:0107 B000 MOV AL,00
0B83:0109 153000 ADC AX,0030
0B83:010C 88C2 MOV DL,AL
0B83:010E B402 MOV AH,02
0B83:0110 CD21 INT 21
0B83:0112 E2F1 LOOP 0105
0B83:0114 CD20 INT 20
(Файл 63.com)
Задание 4.
Используя операцию вычитания, проанализируйте изменение значения флага Z в зависимости от равенства 0 результата операции.
Проанализируйте изменение значения флага S в зависимости от знака результата операции вычитания.
Используя операцию сложения, проанализируйте изменение значения флага O в зависимости от того, привела ли операция к переполнению (несоответствующему изменению знакового флага S)
При вычитании, если результат равен нулю (0003-0003) – устанавливается значение флага Z (ZR), иначе (0004-0002) – сбрасывается (NZ)
При вычитании, если результат отрицательный (0002-0005) – устанавливается значение флага S (NG), иначе (0006-0005) – сбрасывается (PL)
При сложении, если результат переполняется (FFFE+000C>FFFF), то устанавливается значение флага О (OV), иначе – сбрасывается (NV).
Задание 5.
Составьте программу обнуления регистра AX, в котором исходно записано некоторое число.
Программа проверяет, если результат от вычитания нуля из AX результат по-прежнему останется ненулевым – присваиваем AX ноль, иначе – переходим дальше.
0100 BB0000 MOV BX,0000
0103 29D8 SUB AX,BX
0105 7403 JZ 010A
0107 B80000 MOV AX,0000
010A 0000 ...
Задание 6.
Проанализируйте изменения флагов при сравнении разных чисел и составьте таблицу:
|
AX |
BX |
Флаги-значения |
|
7FFD |
0040 |
NV UP EI PL NZ NA PE NC |
|
0004 |
0040 |
NV UP EI NG NZ NA PO CY |
|
0004 |
0004 |
NV UP EI PL ZR NA PE NC |
Флаги соответствуют вычитанию AX-BX
Флаг S – AX>BX
Флаг Z – AX =BX
Флаг C – AX<BX
Задание 7.
Составьте блок-схему и напишите на ассемблере программу, которая берет одну цифру младшего разряда из регистра BL (в BX записано число Аh) и выводит ее на экран (в шестнадцатеричном представлении).
Блок-схема:

Программа:
0B83:0100 BB0A00 MOV BX,000A
0B83:0103 89D8 MOV AX,BX
0B83:0105 80FB0A CMP BL,0A
0B83:0108 7C03 JL 010D
0B83:010A 050700 ADD AX,0007
0B83:010D 053000 ADD AX,0030
0B83:0110 88C2 MOV DL,AL
0B83:0112 B402 MOV AH,02
0B83:0114 CD21 INT 21
0B83:0116 CD20 INT 20
(Файл 67.com)
Задание 8.
Занесите в регистр DX число 72h
Проанализируйте результат выполнения оператора SHR DL,CL при значениях в регистре CL равных 1, 2,4, представьте результат в виде таблицы.
72h= 01110010b
CL=1
|
№ выполнения сдвига |
Биты DL |
Флаг C |
|||||||
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
|
1(DL=39) |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
NC |
|
2(DL=1C) |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
CY |
Очевидно, происходит сдвиг числа вправо на один бит
CL=2
|
№ выполнения сдвига |
Биты DL |
Флаг C |
|||||||
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
|
1(DL=1С) |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
CY |
|
2(DL=7) |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
NC |
происходит сдвиг числа вправо на два бита
CL=4
|
№ выполнения сдвига |
Биты DL |
Флаг C |
|||||||
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
|
1(DL=7) |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
NC |
|
2(DL=0) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
NC |
происходит сдвиг числа вправо на четыре бита
Последний перенесенный вправо бит запоминается во флаге переноса.
Какой сдвиг нужно выполнить, чтобы перевести цифру старшего разряда числа 72h в позицию младшего разряда? Какая цифра будет при этом записана в старшем разряде числа BL?
Для перевода старшей цифры (7) в младший, надо произвести 4 сдвига вправо, тогда старшая цифра станет равной нулю.
Задание 9.
Составьте программу, которая выводит на экран двузначное число из регистра BL, записанное в шестнадцатеричном формате.
Возьмем BL=D5
0B83:0100 B3D5 MOV BL,D5
0B83:0102 B104 MOV CL,04
0B83:0104 88D8 MOV AL,BL
0B83:0106 D2E8 SHR AL,CL
0B83:0108 3C0A CMP AL,0A
0B83:010A 7C02 JL 010E
0B83:010C 0407 ADD AL,07
0B83:010E 0430 ADD AL,30
0B83:0110 88C2 MOV DL,AL
0B83:0112 B402 MOV AH,02
0B83:0114 CD21 INT 21
0B83:0116 80E30F AND BL,0F
0B83:0119 80FB0A CMP BL,0A
0B83:011C 7C03 JL 0121
0B83:011E 80C307 ADD BL,07
0B83:0121 80C330 ADD BL,30
0B83:0124 88DA MOV DL,BL
0B83:0126 B402 MOV AH,02
0B83:0128 CD21 INT 21
0B83:012A CD20 INT 20
Начиная со смещения 116 программа выводит младшую цифру, до этого – старшую
(Файл 69.com)
