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

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

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
Таблица 4.2 – Результат работы программы в пошаговом режиме
Команда EAX … EIP
пп
1 2
СF OF ZF SF
В таблицу включить все используемые в программе регистры, регистр
EIP, а также флаги CF, OF, ZF, SF.
4.5 Требования к отчету
1. Продемонстрируйте работающую программу преподавателю с предъявлением результатов в командной строке.
2. Подготовьте отчет, включающий:
- текст варианта задания;
- ручной вариант расчета (выполненные вручную операции над чис-
Флаги
лами A и B в соответствии с п.1 рабочего задания),
- укрупненную блок-схему алгоритма разработанной программы;
- текст разработанной программы с обязательными комментариями;
- результат работы программы в виде скриншота;
- результаты пошагового выполнения программы в отладчике в виде заполненной таблицы 4.2 (см. п. 2 рабочего задания);
4.6 Контрольные вопросы
1. В чем отличие логических команд от арифметических?
2. В каких случаях следует пользоваться командой логического умножения AND, а в каких - командой TEST?
3. Как можно с помощью логических команд производить очистку (обнуление) регистра?
4. Объясните, как и в каких случаях с помощью команд логического сдвига можно выполнять операции умножения и деления?
5. Каковы особенности выполнения операций логического, арифме- тического и циклического сдвига?
6. Предложите способы решения следующих задач с помощью логи- ческих команд и команд сдвига:
- проверка значений двух заданных битов;
- установка (сброс) заданных битов (двух и более);
- поменять местами значения двух заданных битов числа;
- поменять местами значения байтов AH и AL в регистре AX c по­мощью циклического сдвига.
41
5 ОБРАБОТКА МАССИВОВ. ЛАБОРАТОРНАЯ РАБОТА №4
Содержание работы:
- изучение методов косвенной адресации;
- изучение приемов доступа к элементам массивов;
- изучение циклических команд;
- написание и отладка программ обработки одномерных и двумер­ных массивов.
5.1 Описание и инициализация массивов
Описание и инициализация массивов в программе на ассемблере осу­ществляется с помощью стандартных директив определения данных. Например, одномерный массив MAS1 из пяти однобайтовых числовых эле-
ментов можно описать так:
MAS1 DB 1,-3,0,7,104
Имя массива MAS1 интерпретируется ассемблером как адрес первого элемента массива.
Если необходимо зарезервировать память для одномерного массива с неинициализированными элементами, то это может выглядеть так:
MAS2 DW 5 DUP (?)
Здесь для разнообразия представлен массив двухбайтовых элементов (слов).
При определении двумерных массивов исходят из того, что элементы такого массива будут размещаться в памяти построчно. Поэтому два вари­анта определения двумерного массива однобайтовых элементов размерно­стью 3х3 равнозначны:
1) MAS3 DB 1,2,0,7,5,-3,1,0,4
2) MAS3 DB 1,2,0
DB 7,5,-3 DB 1,0,4
Однако второй вариант предпочтительней в силу большей наглядно­сти.
5.2 Доступ к элементам одномерного массива
Элементы одномерных числовых массивов адресуются с помощью конструкции: имя[регистр] (например, MAS[EBX])
где имя - идентификатор переменной, соответствующий начальному адресу массива, а в регистр должно быть записано смещение выбранного элемента относительно начала массива. Смещение определяется по формуле:
смещение = i * t
42
где i – порядковый номер элемента массива (i=0,1,2,...), t ­количество байт памяти, отводимых под один элемент массива (тип мас-
сива). Значение t можно получить с помощью оператора TYPE.
Таким образом, адрес элемента массива, заданного в виде MAS[EBX], будет определен ассемблером путем сложения начального адреса массива
(MAS) и содержимого регистра EBX: (MAS+(EBX)).
В качестве регистров для записи смещения элементов массива реко­мендуется использовать регистры EBX, ESI, EDI, EBP.
Пример:
MAS1 DB 1,-3,0,7,104 MAS2 DW 1,2,3,4,5 ... MOV ESI,2 ;ESI=2 MOV AL,MAS1[ESI] ;AL:=0 MOV DX,MAS2[ESI] ;DX:=2 ... ADD ESI,2 ;ESI=4 MOV AL,MAS1[ESI] ;AL:=104 MOV DX,MAS2[ESI] ;DX:=3
5.3 Доступ к элементам двумерного массива
Местоположение элемента двумерного массива размерности n x m характеризуется значениями двух индексов: i номер строки (i=0,1,2,...,n), j – номер столбца (j=0,1,2,...,m). Адрес эле­мента A(i,j) при размещении массива в памяти по строкам, может быть определен по формуле:
A + m*i*t + j*t
где А – начальный адрес размещения массива, t - количество байт памяти отводимых под один элемент массива (тип массива), m – число элементов в строке.
Элементы двумерных числовых массивов принято адресовать с по­мощью конструкции: имя[регистр1][регистр2](например, MAS[EBX][ESI])
В качестве имени указывается идентификатор переменной, соответ­ствующий начальному адресу массива. Регистр1 (базовый) служит для
записи смещения первого элемента выбранной строки массива, определяе­мого выражением m*i*t. Регистр2 (индексный) служит для указания
смещения выбранного элемента массива относительно начала строки (j*t).
43
Имейте в виду, что регистры содержат вовсе не индексы (поряд­ковые номера строки и столбца) элементов массива, а их смещения от­носительно начала массива, выраженные в байтах! Адрес элемента массива, заданного в виде MAS[EBX][ESI], будет определен ассембле-
ром путем сложения начального адреса массива (MAS) и содержи­мого регистров EBX и ESI, то есть MAS+(EBX)+(ESI)
Обычно в качестве базового регистра используют регистр EBX, а в качестве индексного - ESI или EDI. Примеры:
;двумерный массив байтов MAS3 DB 1,2,0 DB 7,5,-3 DB 6,8,4 M EQU 3 ;размер строки ... MOV EBX,0 ;i=0 MOV ESI,2 ;j=2 MOV AL,MAS3[EBX][ESI] ;AL:=0 ...
ADD EBX,M ;EBX=3 ;i=i+1 MOV ESI,1 ;j=1
MOV AL,MAS3[EBX][ESI] ;AL:=5
;двумерный массив слов MAS4 DW 1,2,0 DW 7,5,-3 DW 6,8,4 M EQU 3 ;размер строки ... MOV EBX,0 ;i=0 MOV ESI,4 ;j=2 MOV AX,MAS4[EBX][ESI] ;AX:=0 ...
ADD EBX,M*2 ;EBX=6 ;i=i+1 MOV ESI,2 ;j=1
MOV AX,MAS4[EBX][ESI] ;AX:=5
5.4 Организация циклов: команда LOOP
Команду LOOP применяют для организации цикла со счетчиком. Ко- личество повторений цикла задается значением в регистре ECX, которое должно быть установлено перед началом последовательности команд, со-
ставляющих тело цикла.
Формат команды:
LOOP метка
Алгоритм работы:
1) декремент содержимого регистра ECX (ECX:=ECX-1);
2) анализ текущего значения регистра ECX: если ECX<>0, передать
управление на начало цикла команде, метка которой указана в качестве опе­ранда; если ECX=0, передать управление команде, следующей за коман-
дой LOOP;
Устанавливаемые флаги: нет.
Помните о двух важных моментах:
смещение метки, являющейся операндом LOOP, не должно выхо- дить из диапазона -128...+127 байт (соответствует 35-40 командам). Это
смещение, как и в командах условного перехода, является относительным от значения счетчика адреса следующей за LOOP команды.
44
для предотвращения выполнения цикла при нулевом значении
1. Минимальный элемент
2.
Количество положительных элементов
3. Сумма элементов, меньших, чем последний элемент строки
ECX используйте команду JCXZ (JECXZ). Если этого не сделать, то при изначально нулевом ECX цикл будет повторен 4 294 967 296 раз;
Пример:
;Подсчет суммы элементов одномерного массива MAS DW 1,2,3,4,5 N EQU ($-MAS)/TYPE MAS ;число элементов массива (N=5) ... MOV AX,0 ;начальное значение суммы = 0 MOV ECX,N ;загрузка счетчика цикла JECXZ CONT ;не выполнять цикл, если ECX=0 MOV ESI,0 ;начальное значение смещения элемента массива NEXT: ADD AX,MAS[ESI] ;AX:=AX+MAS(i) ADD ESI,2 ;смещение для следующего элемента LOOP NEXT ;повторить, начиная с метки NEXT (всего N раз) CONT: . . .
5.5 Рабочее задание
1. Написать и отладить программу обработки массивов в соответ-
ствии со следующими требованиями. Дан двумерный числовой массив А размерности 4х5, состоящий из положительных и отрицательных чисел.
Сформировать одномерный массив В, состоящий из 4–х элементов. Каж­дый элемент массива В формируется по результатам обработки соответ­ствующей строки матрицы А. Алгоритм обработки строки выбирается в со­ответствии с заданным вариантом (Таблица 5.1). Тип массивов A и B вы­брать самостоятельно.
В шапку программы включить фамилию студента, номер группы, но­мер и текст заданного варианта. Комментарии в тексте программы обяза­тельны.
Пример программы приведен в п. 5.8.
2. Значения исходных данных выбрать самостоятельно, но так, чтобы были задействованы все логические ветви алгоритма программы. Исход­ные данные и результаты работы программы представляются в памяти.
3. Произвести выполнение программы в отладчике и представить ис­ходную матрицу А и результирующий одномерный массив B в десятичном
формате, а также в виде скриншота дампа сегмента данных.
Таблица 5.1 - Варианты заданий
Алгоритм обработки строки матрицы А
45
7. Максимальный элемент
9. Сумма всех элементов с четными порядковыми номерами (0,2,...)
10. Сумма всех элементов с
нечетными порядковыми номерами (1,3,...)
11. Сумма всех элементов, которые больше своего левого соседа
12. Сумма всех элементов, которые меньше своего правого соседа
случае
14. 1, если все
элементы отрицательные, 0
– в противном случае
15. Порядковый номер максимального элемента
16. Среднее арифметическое всех элементов (остаток игнорировать)
записать
–1)
18. Количество нечетных элем
ентов
19. Произведение всех ненулевых элементов
1)
1) 22. Максимальный по модулю элемент
23. Сумма элементов, больших, чем 1
-й элемент строки
24. Частное от деления последнего элемента на первый
25. Количество элементов, у которых 3
-
й и 4
-
й бит равны 1
26. Минимальный положительный элемент
27. Максимальный отрицательный элемент
28. Количество положительных элементов
29. Порядковый номер
минимального элемента
30. Количество нечетных элементов
Алгоритм обработки строки матрицы А
4. Сумма всех элементов, которые следуют за элементом, равным P
5. Сумма всех элементов, которые предшествуют элементу, равному P
6. Сумма всех элементов, больших Р
8. Сумма всех элементов, равных Р или Q
13. 1, если элементы упорядочены по возрастанию, 0 – в противном
17.
Порядковый номер первого элемента, равного P, (если такого нет
20. Порядковый номер минимального положительного элемента (или –
21. Порядковый номер максимального отрицательного элемента (или –
ПРИМЕЧАНИЕ. Числа P и Q выбираются самостоятельно.
5.6 Требования к отчету
1. Продемонстрируйте работающую программу преподавателю с предъявлением результатов с помощью отладчика.
2. Подготовьте отчет, включающий:
- текст варианта задания;
- укрупненную блок-схему алгоритма разработанной программы;
46
- текст разработанной программы с обязательными комментариями;
- результаты работы программы в отладчике виде таблицы и в виде скриншота (см. п. 3 рабочего задания);
5.7 Контрольные вопросы
1. Как описываются одномерные и двумерные массивы в программах на языке ассемблера?
2. В чем суть метода косвенной адресации? Каким образом формиру­ются косвенные адреса при организации доступа к одномерным и двумер­ным массивам?
3. Элемент массива MAS(10x20) адресуется с помощью выражения MAS[EBX][ESI]. Какие значения регистров EBX и ESI следует устано­вить при обращении к элементу массива MAS, размещенному в 3-й строке и 5-м столбце, если исходный массив а) имеет тип DB; б) имеет тип DW; в) имеет тип DD?
4. Поясните выражение ($-MAS)/TYPE MAS, представленное в при- мере п. 5.4.
5. Каковы особенности используемых в языке ассемблера цикличе­ских команд. Можно ли использовать в качестве счетчика цикла вместо ре­гистра ECX другой регистр?
6. Сколько повторений обеспечит команда LOOP, если начальное зна­чение ECX=0?
7. Познакомьтесь с приведенным в п.5.8 примером программы обра­ботки двумерного массива. Объясните:
- какие значения принимают регистры EBX, ESI, EDI, ECX в ходе ра- боты программы;
- что означает и для чего используется выражение M*TYPE A;
- какое значение будет в регистре AL после выполнения команды
MOV AL,A[EBX][ESI] если а) EBX=0,ESI=4; б) EBX=5,ESI=2;
в) EBX=10,ESI=3; г) EBX=1,ESI=1; д) EBX=8,ESI=0 ?
5.8 Пример программы
;Дан двумерный массив А(4х5). ;Сформировать одномерный массив B(4),каждый элемент которого ;равен сумме элементов соответствующей строки массива A: ; B(i)=A(i,0)+A(i,1)+...+A(i,4) i=0,1,2,3 ;================================================== .486 .model flat, stdcall option casemap: none .stack 100h ;=========================================
47
include <\masm32\include\kernel32.inc> includelib <\masm32\lib\kernel32.lib> ;========================================= .data N equ 4 ;количество строк M equ 5 ;количество столбцов A db 1,2,-3,-4,5 db -6,7,-8,9,0 db -1,3,2,-7,4 db 6,-8,2,0,1 B dw 4 dup (?) ;================================================== .code main: ;для адресации элементов массива A используем регистры ; EBX - смещение 1-го элемента текущей строки (0, 5, 10, 15) ; ESI - смещение элемента внутри текущей строки (0, 1, 2, 3, 4) ;для адресации элементов массива B используем регистр ; EDI - смещение элемента
mov ecx,N ;счетчик строк массива A ;(для организации цикла по строкам) mov ebx,0 ;смещение первой строки массива A mov edi,0 ;смещение первого элемента массива B
;----------------­stroka: ;начало цикла по строкам А (внешний цикл) mov B[edi],0 ;обнуляем текущий элемент массива B ;(подготовка для накопления суммы) mov edx,ecx ;спасаем ecx: теперь он понадобится ;для организации цикла по столбцам mov esi,0 ;смещение первого элемента в строке массива A mov ecx,M ;счетчик столбцов массива A ;(для организации цикла по столбцам) ;----------------­next: ;начало цикла по столбцам (внутренний цикл) mov al,A[ebx][esi] ;поместить в AL текущий эл-т массива А cbw ;преобразование AL в слово AX add B[edi],ax ;добавить к сумме очередной эл-т ;строки массива A add esi,type A ;установить si на следующий ;эл-т в строке(+1) loop next ;продолжить, если выбраны не все эл-ты строки ;----------------­ mov ecx,edx ;восстановим cx add ebx,M*type A ;установить bx на начало ;следующей строки массива A(+5) add edi,type B ;установить di на следующий ;элемент массива B(+2) loop stroka ;продолжить, если проверены не все строки ;----------------­ invoke ExitProcess, 0 ;завершение программы end main
48
6 ПРОЦЕДУРЫ. ЛАБОРАТОРНАЯ РАБОТА №5.
Содержание работы:
- изучение структуры стека и приемов его использования;
- изучение команд вызова и возврата из процедур;
- изучение способа передачи параметров при вызове процедур с ис-
пользованием стека;
- написание и отладка программ, использующих процедуры.
6.1 Механизм вызова процедур
Часто в программах встречаются последовательности команд, кото­рые выполняются неоднократно и используются повторно в разных местах программы. Вместо того чтобы повторять эту последовательность команд везде, где она необходима в программе, программист записывает ее в одном месте. Такая часть программы называется процедурой или подпрограммой.
Как только возникает необходимость в действиях, реализуемых про­цедурой, основная программа передает ей управление с помощью специ­альной команды - команды вызова процедуры CALL (рисунок 6.1). Команда
CALL запоминает текущее содержимое регистра EIP (то есть, адрес ко­манды, непосредственно следующей за командой CALL). Этот адрес, назы­ваемый адресом возврата, позволяет вернуться назад к исходной последо-
вательности команд c помощью специальной команды возврата из проце­дуры RET.
. . .
PROC Р ...
RET
. . .
. . .
CALL Р
. . .
Процедураура
Основная программара
Рисунок 6.1 - Вызов процедуры: переход с возвратом
6.2 Работа со стеком
Для хранения адреса возврата, параметров и локальных переменных процедуры используется специальная область памяти программы - стек, определяемая в виде отдельного сегмента с помощью директивы:
.STACK операнд
49
Операнд определяет размер стека в байтах. В сегментированной мо-
. . .
дели памяти сегменту стека соответствует специальный сегментный ре­гистр SS, в котором хранится сегментная часть адреса области памяти, вы-
деленной под стек.
Программа может поместить информацию в стек с помощью команды PUSH или извлечь ее из стека с помощью команда POP. Данные в стеке
организованы специальным образом. Извлекаемый из стека элемент дан­ных - это всегда тот элемент, который был записан туда последним. Такая организация хранения данных сокращенно обозначается LIFO (Last In, First Out - последний поступивший удаляется первым). Если мы поместим в стек два элемента: сначала A, а затем B, то при первом обращении к стеку из­влекается элемент B, а при следующем - A. Информация выбирается из стека в обратном по отношению к записи порядке.
Размещением данных в стеке управляют с помощью регистра ESP, называемого указателем стека (Stack Pointer). Указатель стека в любой мо-
мент времени хранит адрес самого последнего записанного в стек элемента данных. В начальный момент ESP принимает значение N, равное проде-
кларированному размеру стека в байтах (см. рисунок 6.2). В этом случае говорят, что ESP (для сегментированной модели памяти SS:ESP) ука-
зывает на основание (дно) стека. При добавлении данных в стек значение ESP уменьшается, а при извлечении - увеличивается. Таким образом, стек
растет в направлении меньших значений адресов памяти. Текущее значение ESP указывает на так называемую вершину стека. Основание стека имеет
адрес памяти больший, чем его вершина.
SS:0
SS:ESP
стек
SS:NSS
Рисунок 6.2 - Структура стека
6.2.1 Запись в стек
PUSH операнд
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]