Достъп до елементи на масив - Studiopedia

При работа с масиви е необходимо ясно да се разбере, че всички елементи на масива са разположени последователно в паметта на компютъра. Само по себе си подобно разположение не казва нищо за предназначението и реда на използване на тези елементи. И само програмистът, използвайки съставения от него алгоритъм за обработка, определя как трябва да се интерпретира тази последователност от байтове, съставляващи масива. Така че една и съща област от паметта може да се третира като едномерен масив и в същото време същите данни могат да се третират като двумерен масив. Всичко зависи от алгоритъма за обработка на тези данни в конкретна програма. Самите данни не носят информация за техния „семантичен“ или логически тип. Имайте предвид този основен момент.

Същите съображения могат да се разширят доиндекси на елементи от масив. Асемблерът не знае за тяхното съществуване и не се интересува какви са техните числови семантични стойности.

Нека отново да разгледаме дефиницията на масив. Например една програма има статично дефинирана последователност от данни:

база + (индекс*размер на елемент)

oпроменлива (индекс) - указва името на индексния регистър. например:

mas dw 0,1,2,3,4,5. mov si,4;поставете 3-ти елемент от масива mas в регистър ax: mov ax,mas[si]

oпроменлива (база) - указва името на основния регистър;

oпроменлива (индекс) - задаване на името на индексния регистър.

Спомнете си, че всеки от осемте регистъра с общо предназначение може да се използва като основен регистър. Всеки регистър с общо предназначение може също да се използва като индексен регистър, с изключение на esp/sp.

Микропроцесорът ви позволява дамащабирате индекса.Това означава, че ако зададете знака за умножение“*”, последван от числото 2, 4 или 8 след името на индексния регистър, тогава съдържанието на индексния регистър ще бъде умножено по 2, 4 или 8, т.е. мащабирано.

Като пример за това как да използвате мащабиране, разгледайте програма, която разглежда масив от думи и сравнява тези елементи с нула. Показва се съответно съобщение.

Пример: Преглед на масив от думи с помощта на scalingMASMMODEL smallSTACK 256.data ;начало на сегмент от данни;текстове на съобщения:mes1 db 'не е равно на 0!$',0ah,0dhmes2 db 'е равно на 0!$',0ah,0dhmes3 db 0ah,0dh,'Елемент $'mas dw 2,7,0,0,1,9,3,6,0 ,8 ; оригинален array.code.486 ;requiredmain: mov ax,@data mov ds,ax ;връзка ds към сегмент от данни xor ax,ax ;нулиране axprepare: mov cx,10 ;стойност на брояча на цикли в cx mov esi,0 ;индекс в esicompare: mov dx,mas[esi*2] ;първи елемент от масива в dx cmp dx, 0 ;сравняване dx c 0 je равен ;скачане ако е равно not_equal: ;не е равно mov ah,09h ;показва съобщение lea dx,mes3 int 21h mov ah,02h ;показва номер на елемент от масив mov dx,si добавя dl,30h int 21h mov ah,09h lea dx,mes1 int 21h inc esi ;към следващия елемент dec cx ;условие за излизане от цикъла jcxz изход ;cx=0? Ако да, излезте от jmp compare ;no, повторете loopequal: ;equal to 0 mov ah,09h ;покажете съобщение mes3 lea dx,mes3 int 21h mov ah,02h mov dx,si add dl,30h int 21h mov ah,09h ;покажете mes2 съобщение lea dx,mes2 int 21h inc es i ;към следващия елемент dec cx ;обработени ли са всички елементи? jcxz изход jmp compareexit: mov ax,4c00h ;стандартен изход int 21hend main ;край на програмата

Още няколко думи за конвенциите:

Но имайте предвид, че мащабирането е ефективно само когато размерите на елементитемасивът е 2, 4 или 8 байта. Ако размерът на елементите е различен, тогава трябва да организирате достъпа до елементите на масива по обичайния начин, както е описано по-рано.

Помислете за пример за работа с масив от пет трибайтови елемента. Малкият байт във всеки от тези елементи е вид брояч, а старшите два байта са нещо друго, което няма значение за нас. Необходимо е последователно да се обработват елементите на този масив, като се увеличават стойностите на броячите с един.

Пример: Обработка на масив от елементи с нечетна дължинаMASMMODEL small ;memory modelSTACK 256 ;stack size.data ;data segment startN=5 ;брой елементи на масиваmas db 5 dup (3 dup (0)).code ;code segmentmain: ;програмна входна точка mov ax,@data mov ds,ax xor ax,ax ;zero ax mov si,0 ; 0 в si mov cx,N ;N в cxgo: mov dl,mas[si] ;първи байт на полето в dl inc dl ;увеличаване на dl с 1 (по условие) mov mas[si],dl ;изпращане обратно към масива добавяне на si,3 ;преминаване към следващия елемент на масива цикъл отидете ;повтаряне на цикъл mov si,0 ;подготвя се за показване на mov cx,Nshow: ;изход към екран със съдържание; първи байтове от полета mov dl,mas[si] add dl,30h mov ah,02h int 21h цикъл showexit: mov ax,4c00h ;стандартен изход int 21hend main ;край на програмата

Не намерихте това, което търсихте? Използвайте търсачката: