Справочник по языку Ассемблера IBM PC




Двухмерные массивы - часть 2


  • сочетание прямого адреса, как базового компонента адреса, и двух индексных регистров для хранения индексов:

    mov ax,mas[ebx][esi]

  • сочетание двух индексных регистров, один из которых является и базовым и индексным одновременно, а другой — только индексным:

    mov ax,[ebx][esi]

  • В программе это будет выглядеть примерно так:

    ;Фрагмент программы выборки элемента ;массива mas(2,3) и его обнуления .data mas db 23,4,5,67,5,6,7,99,67,8,9,23,87,9,0,8 i=2 j=3 .code ... mov si,4*1*i mov di,j mov al,mas[si][di] ;в al элемент mas(2,3) ...

    В качестве законченного примера рассмотрим программу поиска элемента в двухмерном массиве чисел (листинг 5). Элементы массива заданы статически.

    Листинг 5. Поиск элемента в двухмерном массиве ;prg_11_4.asm MASM MODEL small STACK 256 .data ;матрица размером 2x5 — если ее не инициализировать, ;то для наглядности она может быть описана так: ;array dw 2 DUP (5 DUP (?)) ;но мы ее инициализируем: array dw 1,2,3,4,5,6,7,3,9,0 ;логически это будет выглядеть так: ;array= {1 2} ; {3 4} ; {5 6} ; {7 3} ; {9 0} elem dw 3 ;элемент для поиска failed db 0ah,0dh,'Нет такого элемента в массиве!','$' success db 0ah,0dh,'Такой элемент в массиве присутствует ','$' foundtime db ? ;количество найденных элементов fnd db ' раз(а)',0ah,0dh,'$' .code main: mov ax,@data mov ds,ax xor ax,ax mov si,0 ;si=столбцы в матрице mov bx,0 ;bx=строки в матрице mov cx,5 ;число для внешнего цикла (по строкам) external: ;внешний цикл по строкам mov ax,array[bx][si] ;в ax первый элемент матрицы push cx ;сохранение в стеке счётчика внешнего цикла mov cx,2 ;число для внутреннего цикла (по столбцам) mov si,0 iternal: ;внутренний цикл по строкам inc si ;передвижение на следующий элемент в строке ;сравниваем содержимое текущего элемента в ax с искомым элементом: cmp ax,elem ;если текущий совпал с искомым, то переход на here для обработки, ;иначе цикл продолжения поиска je here ;иначе — цикл по строке cx=2 раз loop iternal here: jcxz move_next ;просмотрели строку? inc foundtime ;иначе увеличиваем счётчик совпавших move_next: ;продвижение в матрице pop cx ;восстанавливаем CX из стека (5) add bx,1 ;передвигаемся на следующую строку loop external ;цикл (внешний) cmp foundtime,0h ;сравнение числа совпавших с 0 ja eql ;если больше 0, то переход not_equal: ;нет элементов, совпавших с искомым mov ah,09h ;вывод сообщения на экран mov dx,offset failed int 21h jmp exit ;на выход eql: ;есть элементы, совпавшие с искомым mov ah,09h ;вывод сообщений на экран mov dx,offset success int 21h mov ah,02h mov dl,foundtime add dl,30h int 21h mov ah,09h mov dx,offset fnd int 21h exit: ;выход mov ax,4c00h ;стандартное завершение программы int 21h end main ;конец программы

    При анализе работы программы не забывайте, что в языке ассемблера принято элементы массива нумеровать с 0. При поиске определенного элемента массив просматривается от начала и до конца.
    Приведенная программа сохраняет в поле foundtime

    количество вхождений искомого элемента в массив. В качестве индексных регистров используются si и bx.




    Содержание  Назад  Вперед