stosw (STOre String Word) — сохранить слово из регистра ax в цепочке;
stosd (STOre String Double Word) - сохранить двойное слово из регистра eax в цепочке.
Эта операция-примитив позволяет произвести действие, обратное команде lods, то есть сохранить значение из регистра-аккумулятора в элементе цепочки. Эту операцию удобно использовать вместе с операцией поиска (сканирования) scans и загрузки lods, с тем, чтобы, найдя нужный элемент, извлечь его в регистр и записать на его место новое значение.
Сложные структуры данных
Одномерные массивы
Все элементы массива располагаются в памяти последовательно
Описание элементов массива
mas db 1,2,3,4,5
mas dw 5 dup (0)
Доступ к элементам массива
mov ax,mas[si] ; в si номер элемента в массиве
mov mas[si], ax ; в di номер элемента в массиве
Используя команды i486 можно использовать адресацию с масштабированием, при размере элементов больше байта
Mov ax, mas[si*2] ;
Пример программы Найти в строке хотя бы один нулевой элемент
model small
.stack 100h
.data
bufer dw 25 ;формирую размер буфера для ввода строки
mas dw 25 dup (' ') ;формирую буфер
adr dw bufer ;описываю адрес
subj1 db ‘в строке найден нулевой элемент', '$'
subj2 db ‘в строке не найден нулевой элемент', '$'
.code
main:
mov ax,@data
mov ds,ax
mov ah,0ah
mov dx, adr
int 21h ; ввод строки с клавиатуры
;поиск нулевого элемента
xor si, si
mov cx, mas[si] ;загружаем в сх количество элементов в строке
mov ax, 030h ;в ax загружаем ASCII код нуля
m1: inc si либо inc si
inc si cmp ax, mas[si*2]
cmp ax, mas[si]
je m2 ;если в строке найдем нулевой элемент, то выходим из цикла на вывод subj1
loop m1
;нормальный выход из цикла означает что в строке нет нулевых элементов
mov ah,09h
lea dx, subj2
int 21h
jmp exit
m2: mov ah, 09h
lea dx,subj1
int 21h
exit: mov ax,4c00h
int 21h
end main
Двумерные массивов
!Специальных средств для описания двумерных массивов в ассемблере нет!
Двумерный массив описывается также как и одномерный массив, отличие заключается в трактовке расположения элементов. Пусть последовательность элементов трактуется как двумерный массив, расположенный по строкам, тогда адрес элемента [i,j] вычисляется так
База+колич_элем_строке*размер_элем*I+j
Для определения базы используют имя массива, для второго слагаемого регистр bx , для третьего si, это базово-индексная адресация.
Описание массива:
Mas1 db 10 dup (3 dup (?))
Mas2 db 1,2,3,4,5
3,4,5,6,7
4,7,9,2,0
Пример поиска максимального элемента в каждой строке однобайтного массива mas, размером 5*10, с занесением максимальных элементов в массив max (1*5). Инициализацию массива mas рассматривать не будем.
…
xor di, di ;обнуляем индексы массива max
xor bx, bx ;обнуляем индексы строк массива mas
xor si, si ;обнуляем индексы столбцов массива mas
mov cx,5 ;в cx количество строк, внешний цикл
m1: push cx
mov cx, 10 ;в сх количество столбцов, внутренний цикл
mov al, mas[si+bx];первый элемент из 1 строки mas в аl
m2: inc si
cmp al, mas[si+bx] ;сравниваем со следующим элем. строки
jb m3 ;если меньше на m3
mov al, mas[si+bx] ;иначе в аl заносим больший элемент
m3: loop m2 ;после выхода из цикла в ах максимальный элемент в данной строке
mov max[di],al ;кладем максимальный элемент в массив max
inc di
xor si,si ;обнуляем номер столбца
add bx, 10 ;переходим на следующую строку
pop cx ;достаем сх
loop m1
…
Структура – это тип данных, состоящий из фиксированного числа элементов разного типа.
Для использования структур в программе необходимо выполнить три действия:
1. Задать шаблон структуры. По смыслу это означает определение нового типа данных (схемы или шаблона), который впоследствии можно использовать для определения переменных этого типа. Память при этом не выделяется, это информация для транслятора о расположении полей и их значению по умолчанию.
Синтаксис описания шаблона структуры:
имя_структуры STRUC
<описание полей> ; последовательность директив описания данных dd,dw,db…
имя_структуры ENDS
2. Определить экземпляр структуры. Этот этап подразумевает инициализацию конкретной переменной заранее определенной (с помощью шаблона) структурой. В данном случае транслятору дается указание выделить память и присвоить этой области символическое имя.
Дата: 2019-12-22, просмотров: 249.