Читайте также:
|
|
Для демонстрации основных приемов работы с массивами лучше всего подходят программы поиска или сортировки. Рассмотрим одну такую программу, выполняющую сортировку массива по возрастанию (листинг 2).
Листинг 6. Сортировка массива
MODEL small
STACK 256
.data
mes1 db 0ah,0dh,'Исходный массив — $',0ah,0dh;некоторые сообщения
mes2 db 0ah,0dh,'Отсортированный массив — $',0ah,0dh
n equ 9;количество элементов в массиве, считая с 0
mas dw 2,7,4,0,1,9,3,6,5,8;исходный массив
tmp dw 0;переменные для работы с массивом
i dw 0
j dw 0
.code
main:
mov ax,@data
mov ds,ax
xor ax,ax
;вывод на экран исходного массива
mov ah,09h
lea dx,mes1
int 21h;вывод сообщения mes1
mov cx,10
mov si,0
show_primary:;вывод значения элементов
;исходного массива на экран
mov dx,mas[si]
add dl,30h
mov ah,02h
int 21h
add si,2
loop show_primary
;строки 40-85 программы эквивалентны следующему коду на языке С:
;for (i=0;i<9;i++)
; for (j=9;j>i;j--)
; if (mas[i]>mas[j])
; {tmp=mas[i];
; mas[i]=mas[j];
; mas[j]=tmp;}
mov i,0;инициализация i
;внутренний цикл по j
internal:
mov j,9;инициализация j
jmp cycl_j;переход на тело цикла
exchange:
mov bx,i;bx=i
shl bx,1
mov ax,mas[bx];ax=mas[i]
mov bx,j;bx=j
shl bx,1
cmp ax,mas[bx];mas[i]? mas[j] — сравнение
jle lesser;если mas[i] меньше, то обмен не нужен и переход на продвижение далее по массиву иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp, tmp=mas[i]
mov bx,i;bx=i
shl bx,1;умножаем на 2, так как элементы — слова
mov tmp,ax;tmp=mas[i]
;mas[i]=mas[j]
mov bx,j;bx=j
shl bx,1;умножаем на 2, так как элементы — слова
mov ax,mas[bx];ax=mas[j]
mov bx,i;bx=i
shl bx,1;умножаем на 2, так как как элементы — слова
mov mas[bx],ax;mas[i]=mas[j]
;mas[j]=tmp
mov bx,j;bx=j
shl bx,1;умножаем на 2, так как элементы — слова
mov ax,tmp;ax=tmp
mov mas[bx],ax;mas[j]=tmp
lesser:;продвижение далее по массиву во внутреннем цикле
dec j;j--
;тело цикла по j
cycl_j:
mov ax,j;ax=j
cmp ax,i;сравнить j? i
jg exchange;если j>i, то переход на обмен
;иначе на внешний цикл по i
inc i;i++
cmp i,n;сравнить i? n — прошли до конца массива
jl internal;если i вывод отсортированного массива
mov ah,09h
lea dx,mes2
int 21h
prepare:
mov cx,10
mov si,0
show:;вывод значения элемента на экран
mov dx,mas[si]
add dl,30h
mov ah,02h
int 21h
add si,2
loop show
exit:
mov ax,4c00h;стандартный выход
int 21h
end main;конец программы
В основе программы лежит алгоритм, похожий на метод пузырьковой сортировки. Эта программа не претендует на безусловную оптимальность, так как существует целая теория, касающаяся подобного типа сортировок. Перед нами стоит другая цель — показать использование средств ассемблера для решения подобного рода задач.
В программе два цикла. Внешний цикл определяет позицию в массиве очередного элемента, с которым производится попарное сравнение элементов правой части массива (относительно этого элемента). За каждую итерацию внешнего цикла на месте этого очередного элемента оказывается меньший элемент из правой части массива (если он есть).
В остальном программа достаточно проста и на языке высокого уровня заняла бы около десятка строк.
ЛИТЕРАТУРА
1. ГСТУ 3008-95. Документация. Отчеты в сфере науки и технологии. Структура и правила оформления. – Киев: Изд-во стандартов, 1995.
2. Единая система программной документации / Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. ГОСТ 19.701- 90. - М.
3. Методические указания к курсовому проектированию для студентов колледжа «Сервер», 2014 г.
4. Абель П. Ассемблер. Язык и программирование для IBM. - М.: Век, 2003
5. Калашников О.А. Ассемблер? Это просто! Учимся программировать. – СПб.:БХВ-Петербург, 2007
6. Кучеренко В. Ассемблер: тонкости, хитрости и секреты программирования.- М.: Майор, 2001
7. Юров В. Assembler. Практикум. – СПб: ПИТЕР, 2004
8. Юров В. Assembler. Учебник. – СПб: ПИТЕР, 2003
9. Зубков С.В. Assembler. Для DOS, Windows и Unix. – М.:ДМК, 1999.
Дата добавления: 2015-04-11; просмотров: 18 | Поможем написать вашу работу | Нарушение авторских прав |