- Учителю
- Изучение массивов на языке Ассемблер
Изучение массивов на языке Ассемблер
Лабораторная работа
Массивы.
Цель: На примере нахождения простых чисел использование массивов.
Ход работы.
Мы почти готовы создать программу, которая ищет простые числа. Осталось только решить, где они будут храниться. Можно, конечно, использовать для этого стек, но в такой памяти положение чисел относительно вершины постоянно меняется, потому что в стеке временно хранятся регистры и адреса возврата для процедур. Найти простые числа в стеке будет непросто.
Будем поэтому хранить найденные числа в обычной памяти - одно за другим. Если каждому числу выделить участок памяти одного размера (например, два байта), то получить адрес любого из них будет крайне просто, если, конечно, знать адрес начала области памяти и номер. Номер числа мы будем задавать сами, адрес же начала однозначно определяет метка.
Программа, показанная в листинге 1, сохраняет 20 чисел (от 1 до 20) в области памяти, начало которой помечено символами simple.
Листинг 1. Сохранение чисел от 1 до 20 в памяти
.386
.model flat, stdcall
option casemap:none
include \asm\include\kernel32.inc
includelib \asm\lib\kernel32.lib
BSIZE equ 20
.data?
simple dw BSIZE dup(?)
.code
start:
mov ecx, BSIZE
mov bx, 1
mov edi, 0
nxt:
mov simple[edi].bx
inc bx
add edi, 2 ;переход к следующему числу
loop nxt
invoke ExitProcess, 0
end start
Директива simple dw BSIZE dup(?) выделяет область памяти, часто называемую массивом, для BSIZE идущих под ряд 2-байтовых слов. Переписать число из регистра bх в нулевое слово этой последовательности можно инструкцией mov simple, bх. Для доступа к первому, второму и т. д. слову в ассемблере есть специальный способ адресации, примененный в программе из листинга 4.5. Предположим, что регистр edi хранит адрес слова, вычисленный относительно начала массива. Тогда само слово будет выглядеть как simple[edi ]. Пусть, например, edi равен 2. Тогда инструкция mov simple[edi], bx записывает содержимое bx в первое слово массива. Если edi равен 0, запись идет в нулевое слово, если равен 4 - во второе и т. д.
В программе из листинга 1 мы записываем числа от 1 до 20 в последовательные ячейки массива. Чтобы перейти к следующей ячейке, edi увеличивается на 2, ведь в нашем массиве хранятся 2-байтовые слова.
Но чтобы получить доступ, скажем, к пятой ячейке, совсем не обязательно проходить через предыдущие четыре. Например, запись числа 19 в пятый элемент нашего массива будет выглядеть так:
mov edi, 5 ;номер элемента массива
add edi, edi ;умножаем на 2
mov simple[edi], 19
В этом фрагменте edi удваивается, потому что наш массив хранит 2-байтовые слова. Если бы там были двойные слова, пришлось бы научиться умножать edi на 4.
Нумерацию в массиве будем вести с нуля. Если, скажем, в массиве 10 чисел, то их номера будут 0,1, 2,3,4, 5, 6, 7, 8, 9.
Кроме edi для доступа к элементам массива можно использовать те же регистры, что и при косвенной адресации, то есть еах, ebx, ecx, edx, ebp, esi. Вообще, доступ к элементам массива можно рассматривать как расширенную косвенную адресацию, ведь инструкцию mov simple[edi], bx можно, оказывается, переписать как mov [simple+edi], bx. А это, по сути, косвенная адресация, где адрес в квадратных скобках, равен сумме адреса, связанного с меткой, и относительного адреса (относительно начала массива), хранящегося в регистре edi.
Если верна инструкция mov [simple+edi], 19, то должен быть смысл и в инструкции mov [simple], 19. Логично предположить, что так записывается число в нулевой элемент массива. Но мы уже знаем, что это можно проделать инструкцией mov simple, 19. Значит, метка в квадратных скобках так же хороша, как и метка без них. В любом случае ассемблер будет считать, что это адрес компьютерной памяти.
Индивидуальные задания.
Вариант
Задание
1
Сохранение в массиве чисел от 4 до 16 с шагом 2. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
2
Сохранение в массиве чисел от 3 до 15 с шагом 3. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
3
Сохранение в массиве чисел от 2 до 10 с шагом 1. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
4
Сохранение в массиве чисел от 1 до 17 с шагом 4. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
5
Сохранение в массиве чисел от 5 до 15 с шагом 1. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
6
Сохранение в массиве чисел от 3 до 21 с шагом 3. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
7
Сохранение в массиве чисел от 2 до 18 с шагом 2. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
8
Сохранение в массиве чисел от 1 до 13 с шагом 1. Каждую инструкцию программы дополнить комментариями. Объяснить полученный результат.
Отчет должен содержать.
-
Тему лабораторной работы.
-
Цель.
-
Постановку задачи.
-
Текст программы, в которой каждая инструкция содержит полный комментарий.
-
Рисунок отладчика.
-
Вывод, в котором дано полное объяснение получения результата и состояния стека после команд.
Контрольные вопросы.
-
Как объявить массив в программе.
-
Как обратиться к элементу массива.
-
Как указать шаг элементов массива.