Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Разработка приложений на языке ассемблер в среде MS MASM. Учебно-методическое пособие по дисциплинам «Ассемблер» и «Операционные системы и системное п

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]