Лабораторная работа №45 / 4
.docСанкт-Петербургский Государственный Электротехнический Университет
Кафедра вычислительной техники
Лабораторная работа №4
3-ий семестр, программирование на языке ассемблера
«Операции групповой обработки»
Студент гр. 181x:
Санкт-Петербург
2002
Задание.
Составить программу, выполняющую заданную обработку массива с помощью команд обработки строк.
Вариант |
Содержимое массива |
Ограничитель размера |
Содержание обработки |
2 |
слова |
количество |
подсчитать количество вхождений каждого слова |
Ход выполнения работы.
Написание программы.
Текст программы:
;lab4
cod segment
assume cs:cod,es:dat
begin: mov ax,dat
mov es,ax
mov di,offset words
cld
mov cx,9 ;количество циклов
mov di,0
repne scasw
shr di,1 ;делим содержимое DI на два сдвигом
;теперь DI содержит количество вхождений
mov ax,4c00h
int 21h
cod ends
dat segment
words dw 1,10,11,100,101,110,111,10000,10001
dat ends
stk segment
db 256 dup(?)
stk ends
end begin
Примечания:
Программа сканирует заданный в дополнительном сегменте данных массив слов. В данном случае – words dw 1,10,11,100,101,110,111,10000,10001. Ограничителем размера массива служит его размер, в данном случае – 9. Данная величина и заносится в регистр СХ. Программа сканирует заданный массив, вычисляет количество вхождений каждого слова путём деления содержимого регистра DI на два после сканирования всего массива.
Отладка.
Исполняемый файл программы был загружен в отладчик. Программа была выполнена пошагово. В процессе её выполнения мы наблюдали за состоянием регистра DI и СХ. Вначале в DX было помещено смещение строки words в дополнительном сегменте данных, в нашем случае – 0. За каждый шаг выполнения строки repne scasw значение в регистре DI увеличивалось на 2 – 6, 8, Ah, Ch и т.д. А значение регистра CX уменьшалось на единицу. Предварительно мы поместили в этот регистр значение 0. После выхода из цикла repne scasw в регистре DI оказалось значение 12h, что соответствует смещению в сегменте данных, указывающему на байт, следующий за последним элементом заданного массива. Поделив значение в DI да два, путём сдвига вправо на один байт, мы получаем количество вхождений каждого байта. Это значение помещается в регистр DI.