Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать
  1. Пример использования вложенных циклов

Программа заменяет все нулевые байты в области памяти на значение 0ffh

model small

.stack 100h

.data

mas db 1,0,9,8,0,7,8,0,2,0

db 1,0,9,8,0,7,8,0,2,0

db 1,0,9,8,0,7,8,0,2,0

db 1,0,9,8,0,7,8,0,2,0

db 1,0,9,8,0,7,8,0,2,0

.code

start:

mov ax,@data

mov ds,ax

xor ax,ax

lea bx,mas

mov cx,5

cycl1:

push cx

xor si,si

mov cx,10

cycl2:

cmp byte ptr [bx+si],0

jne nozero

mov byte ptr [bx+si],0ffh

nozero:

inc si

loop cycl2

pop cx

add bx,10

loop cycl1

mov ax,4c00h

int21h

end start

  1. Массивы

Массив – структурированный тип данных, состоящий из некоторого числа элементов одного типа.

Специальных средств описания массивов в ассемблере не существует, поэтому программист должен знать:

  • как в программах на ассемблере описать массив,

  • как инициализировать массив,

  • как организовать доступ к элементам массива,

  • как организовать выполнение типовых операций с массивами.

Массив в программе можно смоделировать одним из следующих способов:

  1. перечисление элементов массива

mas dd 1, 2, 3, 4, 5 ;массив из 5 двойных слов

  1. используя оператор повторения

mas dw 10 dup (0) ;массив из 10 нулевых слов

  1. используя директивы label и rept

Директива rept относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между rept и endm.

В качестве метки одной области памяти можно использовать разные имена. Каждому имени соответствует указанный тип данных. В примере можно обращаться к массиву байт по метке masb, либо к массиву слов по метке masw.

masb label byte

masw label word

rept 4

dw 0f1f0h ;массив из 4 повторяющихся слов 0f1f0h

endm

.

В общем случае для получения адреса элемента в одномерном массиве необходимо базовый адрес массива сложить с произведением индекса этого элемента (начиная с нуля) на размер элемента массива.

Адрес = База + (Индекс * Размер элемента массива).

Для работы с массивами используются базовые и индексные регистры, позволяющие реализовать несколько режимов адресации данных.

Индексная адресация со смещением.

Эффективный адрес формируется из двух компонент:

постоянного (базового), указывающего на прямой адрес массива в виде имени идентификатора;

переменного (индексного), указывающего на имя индексного регистра.

Пример:

.data

mas dw 0,1,2,3,4,5

……………..

mov si,0

mov ax,mas[si] ;записать в регистр ax слово 0

mov si,2

mov ax,mas[si] ;записать в регистр ax слово 1

Базовая индексная адресация со смещением

Этот вид адресации используется при работе с двумерными массивами.

Эффективный адрес формируется максимум из трех компонентов:

постоянного (необязательного), указывающего на прямой адрес массива в виде имени идентификатора;

переменного (базового) – имени базового регистра;

переменного (индексного) – имени индексного регистра.

Микропроцессор позволяет масштабировать содержимое индексного регистра (умножать на 2, 4, 8), что обеспечивает вычисление адресов операндов типа w, dw, dd

Пример:

mov eax, mas[ebx*4] ; mas +(ebx)*4

mov ax, mas[ebx] [ecx*2] ; mas +(ebx)+(ecx)*2

sub ax, [ebx+8] [ecx*4] ; (ebx)+8+(ecx)*4

Программист должен трактовать некоторую область памяти как двумерный массив. При этом можно выбрать расположение элементов массива в памяти: по строкам или по столбцам.

Если последовательность однотипных элементов трактуется как двумерный массив, расположенный по строкам, то адрес элемента (i,j) вычисляется по формуле:

база + i*m*d + j*d

где m – число столбцов в массиве,

i – номер строки (0…n-1),

j- номер столбца (0…m-1),

d- размер элемента в массиве (1,2,4,6….).

Пусть число строк в массиве n=4, и число столбцов m=3.

0 2 4

6 8 10

12 14 16

18 20 22

Вычислить адрес элемента во второй строке и первом столбце (i=2, j=1) массива слов mas.

Эффективный адрес элемента массива:

mas(2,1)=mas+2*3*2+1*2=mas+14

Вычисленный адрес указывает на число 14 (совпадает с адресом)

Пример программы

Программа ищет в массиве число 10

.data

mas dw 0, 2, 4, 6, 8, 10, 12, 14,16, 18, 20, 22

found db 0 ; счетчик успешных попыток

d=2

m=3 ;число столбцов в массиве

n=4 ;число строк в массиве

elem=10 ;элемент для поиска

.code

…….

mov bx,0 ; начало с нулевой строки

mov si,0 ; нулевой столбец

mov cx,4 ;параметр внешнего цикла по строкам

exter: ;начало внешнего цикла

push cx ;сохраним в стеке счетчик внешнего цикла

mov cx,3 ; параметр внутреннего цикла по столбцам

mov si,0

inter: ;начало внутреннего цикла

mov ax,mas [bx] [si*2]

inc si

cmp ax,elem

jne $+6

inc found

loop inter

pop cx

add bx,m*d

loop exter

.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]