Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Разработка приложений на языке ассемблер в среде MS MASM. Учебно-методическое пособие по дисциплинам «Ассемблер» и «Операционные системы и системное п
.pdf
3X-5, X<=60
1
Y= 100-X/7, 60<X<=100
X+54, X>100
8X-10, X<30
2
Y= 120+X/4, 30<=X<=160
X+25, X>160
5X-150, X<50
3
Y= 2X+50, 50<=X<=100
X/15+245, X>100
6X-70, X<=40
4
Y= 160+X/8, 40<X<110
50+X, X>=110
X/5-1, X<=30
5
Y= 3X-80, 30<X<=80
150+X, X>80
65+4X, X<50
6
Y= 10-200/X, 50<=X<200
X+15, X>=200
5X+8, X<40
7
Y= 4X-111, 40<=X<=60
X/12+240, X>60
50-2X, X<=30
8
Y= X/4-1, 30<X<160
X+21, X>=160
2X-15, X<=90
9
Y= 250-2X, 90<X<=100
X/15+245, X>100
5X-15, X<=40
10
Y= 160+X/8, 40<X<=200
X+50, X>200
X/6-3, X<30
11
Y= 2X+80, 30<=X<=70
140+X, X>70
-43+6X, X<=40
12
Y= 10-200/X, 40<X<=150
X+99, X>150
8-2X, X<=10
13
Y= 100/X-5, 10<X<20
X+170, X>=20
256-2X, X<90
14
Y= -X/50+10,90<=X<=160
X+70, X>160
200/X-7, X<=45
15
Y= 155-2X, 45<X<=75
X/15+245, X>75
-3X+90, X<=40
16
Y= 1+120/X, 40<X<60
140+X, X>=60
180/X-1, X<=30
17
Y= -3X-5, 30<X<=50
180+X, X>50
100-2X, X<=80
18
Y= -1+250/X,80<X<=200
X+35, X>200
8X-37, X<=10
19
Y= X-5, 10<X<=20
200/X+104, X>20
5X-18, X<50
20
Y= (90+X)/7,50<=X<=90
X+150, X>90
120-5X, X<30
21
Y= (X+140)/X,30<=X<95
X+84, X>=95
1000/(X+20), X<100
22
Y= -120+3X,100<X<=120
40+X, X>120
-14X+250, X<=20
23
Y= X+1000/X, 20<X<200
10+X, X>=200
(70-X)/5, X<80
24
Y= 3X-160, 80<=X<=100
X+124, X>100
4X+48, X<=70
25
Y= 3X-210, 70<X<=120
235+X/10, X>120
280/(X+1), X<=65
26
Y= 185-2X, 65<X<90
X+54, X>=90
(X-2)/2, X<40
27
Y= 7X-250, 40<=X<=70
12+X, X>70
840/(X+30), X<=140
28
Y= -120+2X,140<=X<180
55+X, X>=180
2X-15, X<200
29
Y= 250-X, 200<=X<220
X/11+238, X>=220
255-5X, X<55
30
Y= -X/15+10,55<=X<135
X+17, X>=135
2. Произвести выполнение программы в отладчике при четырех раз-
личных значениях переменной X и заполнить таблицу 3.3.
Таблица 3.3 - Результаты расчетов
X1= X2= X3= X4=
Y (hex)
Y (dec)
X1, X2, X3 – допустимые значения переменной X для каждого из
трех заданных диапазонов, не приводящие к арифметическим ошибкам;
X4 – значение X, приводящее к арифметической ошибке (установле-
нию флага переноса или переполнения) при вычислениях в одном из диапазонов.
3. Выполняя программу в отладчике в пошаговом режиме сначала при
X=X1, а затем при X=X4, заполнить таблицу 3.4.
Таблица 3.4 - Результаты выполнения программы в пошаговом режиме
31

№
пп
Флаги
Команда
1
2
…
EAX … EIP X Y MYERR
СF OF ZF SF
В таблицу включить все используемые в программе регистры, регистр
EIP, содержимое памяти в ячейках X, Y и MYERR, а также флаги CF,
OF, ZF, SF. Значения регистров, переменных и флагов фиксировать после
выполнения соответствующей команды.
3.5 Требования к отчету
1. Продемонстрируйте работающую программу преподавателю с
предъявлением результатов в командной строке.
2. Подготовьте отчет, включающий:
- текст варианта задания с указанием типа переменных X и Y;
- укрупненную блок-схему алгоритма разработанной программы;
- текст разработанной программы с обязательными комментариями;
- результаты работы программы в виде заполненной таблицы 3.3 и
скриншотов окон отладчика (см. п. 2 рабочего задания);
- результаты пошагового выполнения программы в отладчике в виде
заполненной таблицы 3.4 (см. п. 3 рабочего задания);
3.6 Контрольные вопросы
1. Поясните действие команд умножения и деления в вашей программе. Почему команды умножения и деления используют только один
явный операнд?
2. Как согласуются типы операндов при выполнении различных
арифметических операций?
3. Что означают и как формируются флаги переноса (CF), переполнения (OF), знака (SF) и нуля (ZF) при выполнении различных арифметических операций?
4. В чем сходство и различие операций вычитания (SUB) и сравнения
(CMP)?
5. Почему следует использовать разные команды условного перехода
при сравнении знаковых и беззнаковых чисел?
6. Поясните различия между длинным, коротким, ближним и дальним переходами.
7. Запишите команды для вычисления выражений: 2*17-3;
250/13+8; 47*10/7; (720-350)/3.
32

3.7 Пример программы
;Лабораторная работа №2
;Выполнил ст. гр. УXX-311 XXXXXXXXXX YYYYYYY
;Вариант 1234
; 220-8*x, x<30
; y= 800/x-10, 30<=x<75
; x+145, x>=75
.486
.model flat, stdcall
option casemap: none
.stack 100h
;=========================================
include <\masm32\include\kernel32.inc>
includelib <\masm32\lib\kernel32.lib>
;=========================================
.data
x db 100
y db ?
myerr db 0
;=========================================
.code
main:
cmp x, 30 ; х-30 ?
jae int2 ; если x>=30 перейти к метке int2
; вычисление 220-8*x
mov al, 8
mul x ; ax:=8*x
; дальше учитываем, что произведение целиком находится в al
mov bl, 220
sub bl, al ; bl:=220-8*x
jc osh ; если есть перенос - ошибка, перейти к метке osh
mov al, bl ; результат сохраняем в al
jmp fin ; перейти к метке fin
;-------------------------------int2:
cmp x, 75 ; х-75 ?
jae int3 ; если x>=75 перейти к метке int3
; вычисление 800/x-10
mov ax, 800
div x ; al:=ax/x=800/x
sub al, 10 ; al:=800/x-10
jmp fin ; перейти к метке fin
;-------------------------------; вычисление x+145
int3:
mov al, x
add al, 145 ; al:=x+145
jnc fin ; если флаг переноса не установлен перейти к fin
osh: mov myerr, 1 ; установить код ошибки
jmp exit ; перейти к метке exit
;-------------------------------fin: mov y, al ; сформировать результат в переменной y
exit: mov al, myerr ; код завершения программы
invoke ExitProcess, al
end main
33

4 БИТОВЫЕ ОПЕРАЦИИ. ЛАБОРАТОРНАЯ РАБОТА №3
Содержание работы
- изучение логических команд и команд сдвига;
- написание и отладка программы анализа битовой структуры данных.
4.1 Команды логических операций AND, TEST, OR, XOR, NOT
Наряду со средствами арифметических вычислений система команд
микропроцессора Intel имеет также средства логического побитного преобразования данных, представленные командами логических операций и
командами сдвига.
Рассматриваемые команды предназначены для побитного (поразрядного) выполнения следующих логических операций:
логическое умножение (AND, TEST): если оба из сравниваемых би-
тов равны 1, то результат равен 1; во всех остальных случаях результат - 0.
Команда TEST (в отличие от AND) не сохраняет результат выполненной
операции;
логическое сложение (OR): если хотя бы один из сравниваемых би-
тов равен 1, то результат равен 1; если сравниваемые биты равны 0, то ре-
зультат – 0;
логическое исключающее сложение (исключающее ИЛИ) (XOR):
если один из сравниваемых битов равен 0, а другой равен 1, то результат
равен 1; если сравниваемые биты одинаковы (оба - 0 или оба - 1) то результат – 0;
логическое отрицание (NOT): одноместная операция: если бит равен
1, то результат равен 0; если бит равен 0, то результат равен 1;
В таблице 4.1 представлены результаты основных логических операций в зависимости от значений исходных операндов.
Таблица 4.1 - Основные логические операции
X Y X AND Y X OR Y X XOR Y
NOT X
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0
Для всех команд, кроме NOT, требуется задать два операнда. Первый
и второй операнды могут иметь тип m8,r8,m16,r16,m32,r32. Второй операнд, кроме того, может быть задан непосредственно (i8,i16,i32). Оба
34

операнда должны быть согласованы по типу! Результат логической команды, кроме команды TEST, записывается в первый операнд. Команда
TEST не изменяет значение операндов, а воздействует исключительно на
флаги. Все логические команды (кроме NOT) формируют флаги ZF, SF, PF.
Флаги CF и OF сбрасываются в 0.
Рассмотрим ряд не связанных между собой примеров, предположив,
что AL содержит число 11000101b, а BH содержит число 01011100b.
Операции выполняются поразрядно:
1. AND AL,BH ;Устанавливает в AL 0100 0100
2. OR BH,AL ;Устанавливает в BH 1101 1101
3. XOR AL,AL ;Устанавливает в AL 0000 0000
4. AND AL,0 ;Устанавливает в AL 0000 0000
5. AND AL,0FH ;Устанавливает в AL 0000 0101
6. NOT AL ;Устанавливает в AL 0011 1010
Примеры 3 и 4 демонстрируют способ очистки регистра. В примере 5
обнуляются левые четыре бита (старшая тетрада) регистра AL.
Команда NOT (пример 5) устанавливает инверсное значение битов:
нули становятся единицами, а единицы - нулями. Флаги при этом не изме-
няются. Команду NOT не следует путать с командой NEG, которая меняет
значение с положительного на отрицательное и наоборот.
Команду TEST целесообразно применять для проверки значений битов первого операнда с помощью специальной маски, задаваемой вторым
операндом (см. п. 4.3.1). Ниже приведено несколько примеров:
1. TEST BL,10000000B ;Старший бит в BL
JNZ ... ; не равен нулю?
2. TEST AL,00000001B ;Младший бит AL
JZ ... ; равен нулю?
Здесь значение проверяемого бита однозначно влияет на результат
выполнения команды TEST (логического умножения). Если проверяемый бит
равен нулю, то и результат логического умножения на маску тоже будет равен
0, что приведет к установке флага ZF. Если же проверяемый бит равен единице,
то результат операции логического умножения окажется ненулевым.
4.2 Команды сдвига
Команды сдвига служат для перемещения битов числа влево или
вправо на заданное число позиций. Поддерживается три типа команд
сдвига: логический, арифметический и циклический.
4.2.1 Логический сдвиг SHR, SHL
Логический сдвиг вправо:
SHR операнд,счетчик
Логический сдвиг влево:
SHL операнд,счетчик ;
35

Тип операнда: m8,r8,m16,r16,m32,r32
Счетчик задается непосредственным значением или в регистре CL.
Формируемый флаг: CF - содержит значение последнего бита,
выдвинутого за пределы разрядной сетки.
Пример:
MOV CL,3
MOV AL,10110111B ;AL=10110111
SHR AL,1 ;AL=01011011, CF=1 ;Сдвиг вправо на 1
SHR AL,CL ;AL=00001011, CF=0 ;Сдвиг вправо на 3
Первая команда SHR сдвигает содержимое регистра AL вправо на
1 бит. Выдвинутый в результате один бит попадает в флаг CF, а самый
левый бит регистра AL заполняется нулем. Вторая команда сдвигает
содержимое регистра AL еще на три бита. При этом флаг CF
последовательно принимает значения 1, 1, 0, а в три левых бита в регистре
AL заносятся нули.
4.2.2 Арифметический сдвиг SAR, SAL
Арифметический сдвиг вправо:
SAR операнд,счетчик ;
Арифметический сдвиг влево:
SAL операнд,счетчик ;
Тип операнда: m8,r8,m16,r16,m32,r32
Счетчик задается непосредственным значением или в регистре CL.
Формируемый флаг: CF - содержит значение последнего
выдвинутого бита.
Арифметический сдвиг учитывает знак сдвигаемого числа.
Пример:
MOV CL,3
MOV AL,10110111B ; AL=10110111
SAR AL,1 ; AL=11011011 Сдвиг вправо на 1
SAR AL,CL ; AL=11111011 Сдвиг вправо на 3
Команда SAR имеет важное отличие от команды SHR: для
заполнения левого бита используется знаковый бит. Таким образом,
положительные и отрицательные величины сохраняют свой знак. В
приведенном примере знаковый бит содержит единицу.
При сдвигах влево правые биты заполняются нулями. Таким образом,
результат команд сдвига SHL и SAL идентичен.
Сдвиг влево часто используется для удваивания чисел, а сдвиг вправо
- для деления на 2. Эти операции осуществляются значительно быстрее,
чем арифметические команды умножения или деления (MUL и DIV).
Деление пополам нечетных чисел (например, 5 или 7) образует меньшие
36

значения (2 или 3, соответственно) и устанавливают флаг CF в 1. Кроме
0 0 0 0 0 0 Х10
- результат
того, если необходимо выполнить сдвиг на 2 бита, то использование двух
команд сдвига более эффективно, чем использование одной команды с
загрузкой регистра CL значением 2.
Для проверки бита, занесенного в флаг CF используется команда JC
(переход, если есть перенос).
4.2.3 Циклический сдвиг ROR, ROL
Циклический сдвиг вправо:
ROR операнд,счетчик
Циклический сдвиг влево:
ROL операнд,счетчик
Циклический сдвиг представляет собой операцию сдвига, при
которой выдвинутый бит занимает освободившийся разряд.
Следующая последовательность команд иллюстрирует операцию
циклического сдвига ROR:
MOV CL,03 ;
MOV BL,10110111B ; BL=10000111
ROR BL,1 ; BL=11000011 ;Сдвиг вправо на 1
ROR BL,CL ; BL=01111000 ;Сдвиг вправо на 3
Первая команда ROR при выполнении циклического сдвига
переносит каждый бит, начиная со старшего, на одну позицию вправо. При
этом младший бит регистра BL переходит в освободившуюся позицию
старшего бита. Вторая команда ROR переносит таким же образом три
младших бита.
4.3 Типовые задачи использования битовых операций
4.3.1 Проверка значения бита
Проверка значения заданного бита числа, записанного в регистре или
переменной, производится путем логическое умножения данного числа на
специальную маску - число, которое содержит нули во всех разрядах, кроме
проверяемого. Проверяемый разряд содержит 1.
Например, задано некоторое число, записанное в регистре AL.
Необходимо выяснить значение 1-го бита этого числа (напомним, что биты
нумеруются справа налево, начиная с 0). Проверка производится с помощью маски 00000010b следующим образом:
Х7Х6Х5Х4Х3Х
and
0 0 0 0 0 0 1 0 - маска
2Х1Х0
- содержимое проверяемого регистра
37

Результатом в данном случае может быть либо значение 00000000
Х7Х6Х5Х4Х3Х21 Х
0
- результат
or
and
(это значит, что проверяемый бит Х1 равен 0) либо 00000010 (это
значит, что проверяемый бит равен 1).
На Ассемблере данную проверку можно осуществить так:
AND AL,00000010b
JZ B0 ;Если результат в AL=00000000,перейти к B0
. . . ;иначе имеем AL=00000010
B0:
Вместо команды AND часто целесообразно использовать команду
TEST, так как она не портит содержимое проверяемого регистра:
TEST AL,00000010b или TEST AL,2
4.3.2 Установка единичного значения бита
Установка единичного значения заданного бита числа, записанного в
регистре или переменной, производится путем логическое сложения данного числа с двоичным числом, которое содержит нули во всех разрядах,
кроме заданного. Заданный бит содержит 1.
Например, необходимо установить значение 1-го бита некоторого
числа в регистре AL в 1. Установка производится с помощью двоичного
числа 00000010b следующим образом:
Х7Х6Х5Х4Х3Х
0 0 0 0 0 0 1 0 - маска
2Х1Х0
- заданное число
Результатом в данном случае всегда будет число, содержащее единицу в 1-м разряде, независимо от исходного значения данного бита. При
этом остальные биты останутся неизменными.
На Ассемблере этот пример можно представить так:
OR AL,00000010b или OR AL,2
4.3.3 Установка нулевого значения (сброс) бита
Установка нулевого значения заданного бита числа, записанного в регистре или переменной, производится путем логическое умножения данного числа на двоичное число, которое содержит единицы во всех разрядах,
кроме заданного. Заданный разряд содержит 0.
Необходимо сбросить значение 1-го бита этого числа в 0.
Например, дано некоторое число, представленное в регистре AL.
Х7Х6Х5Х4Х3Х
1 1 1 1 1 1 0 1 - маска
Х7Х6Х5Х4Х3Х20 Х
2Х1Х0
- заданное число
- результат
0
38

Сброс бита производится с помощью двоичного числа 11111101b сле-
дующим образом:
Результатом в данном случае всегда будет число, содержащее ноль в
1-м разряде, независимо от исходного значения данного бита. При этом
остальные биты останутся неизменными.
На Ассемблере этот пример выглядит так:
AND AL,11111101b или AND AL,253
4.3.4 Инвертирование значения бита
Инверсия бита - это изменение его значения на противоположное: 0
на 1 или 1 на 0.
Инвертирование значения заданного бита числа, записанного в регистре или переменной, производится путем выполнения операции исключающего ИЛИ над данным числом и двоичным числом, которое содержит
нули во всех разрядах, кроме заданного. Заданный разряд содержит 1.
Например, дано некоторое число, представленное в регистре AL.
Необходимо инвертировать значение 1-го бита этого числа. Инвертирова-
ние бита производится с помощью двоичного числа 00000010b следую-
щим образом:
xor
Х7Х6Х5Х4Х3Х
0 0 0 0 0 0 1 0 - маска
Х7Х6Х5Х4Х3Х2Х1Х
2Х1Х0
- заданное число
- результат
0
Результатом в данном случае всегда будет число, содержащее в 1-м
разряде значение, инверсное исходному значению данного бита. При этом
остальные биты останутся неизменными.
На Ассемблере этот пример выглядит так:
XOR AL,00000010b или XOR AL,2
4.3.5 Перемещение битов числа
Перемещение битов числа производится с помощью операций сдвига.
Например, для перестановки местами первой и второй тетрад байта (тетрада=4 бита) можно использовать команды логического сдвига. В этом случае необходимо выполнить следующую последовательность действий:
MOV AL,10110001B ;дано исходное число 1011 0001
MOV BL,AL ;копия исходного числа в BL
SHR AL,4 ;AL:=0000 1011
SHL BL,4 ;BL:=0001 0000
OR AL,BL ;AL:=0001 1011
Легко и изящно такой же результат можно получить с помощью команды циклического сдвига:
39

ROR AL,4
4.4 Рабочее задание
1. Даны два числа: A - ASCII код первой буквы фамилии студента (берется прописная буква), B - ASCII код первой буквы имени студента (берется строчная буква). Например:
A DB ”Ы”
B DB ”й”
Написать и отладить программу, выполняющую следующие действия
(значения R, i, j и k выбрать в соответствии с заданным в таблице
4.3 вариантом):
1) (A AND B) OR B => R, где R заданный регистр;
2) Если i-й бит регистра R равен 0, то записать 1 в k-й бит регистра
R, иначе 0;
3) Инвертировать j-й бит регистра R;
4) Поменять местами тетрады байта, записанного в регистре R;
5) Если полученное значение меньше, чем 32, прибавить к R 32;
6) Вывести на экран символ, код которого представлен в регистре R
с помощью вызова функции MessageBox:
MOV rez,BL ;Запись кода символа в rez
INVOKE MessageBox, 0, OFFSET rez, OFFSET tit, 0
В шапку программы включить сведения об авторе и номер варианта.
Текст программы сопровождать комментариями!
Таблица 4.3 - Варианты задания
# R i j k # R i j k # R i j k
1 AL 3 0 1 11 BL 1 0 7 21 CL 5 0 3
2 AH 3 4 5 12 BH 6 5 4 22 CH 6 1 4
3 BL 6 7 0 13 CL 3 2 1 23 DL 7 2 5
4 BH 1 2 3 14 CH 0 7 6 24 DH 0 3 6
5 CL 4 5 6 15 DL 5 4 3 25 AL 0 1 2
6 CH 7 0 1 16 DH 2 1 0 26 AH 5 2 7
7 DL 2 3 4 17 AL 1 4 7 27 BL 7 4 2
8 DH 5 6 7 18 AH 2 5 0 28 BH 2 6 0
9 AL 7 6 5 19 BL 3 6 1 29 CL 0 3 5
10 AH 4 3 2 20 BH 4 7 2 30 CH 4 7 3
2. Выполнить программу в отладчике в пошаговом режиме и заполнить таблицу 4.2.
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
