A. Массивы. Идентификация массивов. Поиск и сортировка
Массив – это упорядоченный набор однотипных элементов.
Для задания массивов целых чисел удобнее всего использовать оператор дублирования dup.
В Ассемблере нет возможности объявления двух- и более мерных массивов. Для организации таких структур данных программисту необходимо самому предусматривать их обработку, то есть определять, как будут храниться элементы массива.
;-------------------------------------------------------------------------------------------------------------------------------------------
; поиска максимального элемента в третей строке массива 2×10
; двухбайтных элементов
data segment
; задание и инициализация массива arr
arr dw 438,4,76,87,34,67,234,90,48,0
dw 34,-15,2451,6125,864,92,238,4769,1237,6281
dw 10,59,251,125,64,2,8,49,37,81
data ends
stack1 segment stack
db 100h dup(?)
stack1 ends
code segment
assume cs:code,ds:data,ss:stack1
begin:
mov ax,data
mov ds,ax ; занесение в ds адреса начала сегмента данных data
; позиционирование в массиве на первый элемент ретей строки
mov ax,2 ; нумерация начинается с 0
mov cl,10*type arr ; десять двухбайтных элементов
mul cl ; в ax – позиция первого элемента третей строки
mov bx,ax ; занесение в bx значения из ax, так как регистр ax не
; может быть использован для косвенной адресации
mov ax,arr[bx] ; занесение в ax первого элемента третей строки
; поиск максимума
mov cx,10-1 ; будет сравниваться 9 элементов
L1:
add bx,type arr ; увеличение на 2 индекса массива
cmp ax,arr[bx] ; в ax – текущий максимум
jge no_new_max ; если в ax число, меньшее элемента массива, то
mov ax,arr[bx] ; занесение нового максимума в ax
no_new_max:
loop L1 ; цикл, после выполнения которого в ax будет
; находится число 251
mov ah,4ch
int 21h ; выход из программы
code ends
end begin
;-------------------------------------------------------------------------------------------------------------------------------------------
;сортировка одномерного массива методом пузырька
data segment
array dw 10 dup (4,3,2,5,0)
n dw ?
data ends
stack1 segment stack
db 100h dup(?)
stack1 ends
code segment
assume cs:code,ds:data,ss:stack1
begin:
mov ax,data
mov ds,ax
mov n,10
mov bx, offset array
mov cx, n
for_i:
dec cx
xor dx, dx
for_j:
cmp dx, cx
jae exit_for_j
jbe no_swap
mov ah, byte ptr bx[di]
mov byte ptr bx[di], al
mov byte ptr bx[si], ah
no_swap:
inc dx
jmp for_j
exit_for_j:
loop for_i
mov ah,4ch
int 21h
code ends
end begin