
- •Основы алгоритмизации и программирования
- •29 Декабря 2011, протокол № 4
- •Введение
- •Этапы развития эвм
- •Поколения эвм
- •Машинно-ориентированные языки программирования
- •Архитектура эвм
- •Микропроцессоры intel
- •Набор регистров
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Организация памяти
- •Сегментная организация памяти
- •Типы данных
- •Символы
- •Целые числа
- •Указатель на память
- •Цепочки
- •Вещественые числа
- •Двоично-десятичные числа (bcd)
- •Формат команд
- •Обработка прерываний
- •Int тип_прерывания
- •Синтаксис ассемблера
- •Алфавит ассемблера
- •Директивы сегментации
- •Упрощённые директивы сегментации
- •Директивы резервирования и инициализации данных
- •Операнды
- •Способы задания операндов Прямая адресация
- •Косвенная адресация
- •Косвенная базовая адресация
- •Косвенная базовая адресация со смещением
- •Косвенная индексная адресация со смещением
- •Косвенная базовая индексная адресация
- •Косвенная базовая индексная адресация со смещением
- •Операторы
- •Функциональная классификация машинных команд
- •Команды пересылки данных Команды общего назначения
- •Работа с адресами и указателями
- •Преобразование данных
- •Xlat [адрес_таблицы_перекодировки]
- •Ввод из порта и вывод в порт
- •Работа со стеком
- •Арифметические команды Форматы арифметических данных
- •Арифметические операции над целыми двоичными числами
- •Логические команды
- •Команды передачи управления
- •Команда безусловного перехода
- •Условные переходы
- •Организация циклов
- •Основы алгоритмизации и программирования
Организация циклов
Организовать циклическое выполнение некоторого фрагмента программы можно, к примеру, используя команды условной передачи управления или команду безусловного перехода JMP.
Например, подсчитаем количество нулевых байтов в области mas.
model small
.stack 100h
.data
len equ 10 ;количество элементов в mas
mas db 1,0,9,8,0,7,8,0,2,0 ;инициализируем массив
.code
start :
mov ax,@data
mov ds, ax
mov сx, len ;длину поля mas в сх
xor ax,ax ;обнуляем ax
xor si,si ;обнуляем si
cycl :
jcxz exit ;проверка сх на 0, если 0, то выход
cmp mas[si],0 ;сравнить элемент mas с 0
jne ml ;если не равно 0, то на ml
inc al ;в al - счетчик нулевых элементов
ml:
inc si ;перейти к следующему элементу
dec сх ;уменьшить сх на 1
jmp cycl ;переход на метку cycl
exit :
mov ax,4c00h
int 21h
end start
Цикл организован тремя командами, JCXZ, DEC и JMP . Команда JCXZ выполняет здесь две функции: предотвращает выполнение «пустого» цикла (когда счетчик цикла в СХ равен нулю) и отслеживает окончание цикла после обработки всех элементов поля mas. Команда DEC после каждой итерации цикла уменьшает значение счетчика в регистре СХ на 1.
Команда LOOP также позволяет организовать циклы (loops), подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Синтаксис команды:
loop метка_перехода
Команда реализует описанные далее действия.
1. Декремент регистра СХ.
2. Сравнение регистра СХ с нулем:
если (СХ) > 0, то управление передается на метку перехода;
если (СХ) = 0, то управление передается на следующую после LOOP команду.
Команды LOOPE и LOOPZ (Loop still сх <> 0 or Zero flag = 0 — повторить цикл пока СХ <> 0 или ZF = 0) — абсолютные синонимы. Синтаксис команд:
loope/loopz метка_перехода
Команды реализуют описанные далее действия.
1. Декремент регистра СХ.
2. Сравнение регистра СХ с нулем и анализ состояния флага нуля ZF:
если (СХ) > 0 и ZF = 1, управление передается на метку перехода;
если (СХ) = 0 или ZF=0, управление передается на следующую после LOOP команду.
Команды LOOPNE и LOOPNZ (Loop still ex <> 0 or NonZero flag = 0 — повторить цикл, пока СХ <> 0 или ZF = 1) также абсолютные синонимы. Синтаксис команд:
loopne/loopnz метка_перехода
Команды реализуют описанные далее действия.
1. Декремент регистра СХ.
2. Сравнение регистра СХ с нулем и анализ состояния флага нуля ZF:
если (СХ) > 0 и ZF = 0, управление передается на метку перехода;
если (СХ) = 0 или ZF = 1, управление передается на следующую после LOOP команду.
Команды LOOPE/LOOPZ и LOOPNE/LOOPNZ по принципу своей работы являются взаимнообратными. Они расширяют действие команды LOOP тем, что дополнительно анализируют флаг ZF. Это дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора. Типичное применение этих команд связано с операцией поиска определенного значения в последовательности или со сравнением двух чисел.
Недостаток команд организации цикла LOOP, LOOPE/LOOPZ и LOOPNE/LOOPNZ заключается в том, что они реализуют только короткие переходы (от -128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду JMP
Пример. Подсчет нулевых байтов с использованием команд управления циклом
model small
.stack 100h
.data
len equ 10 ;количество элементов в mas
mas db 1,0,9,8,0,7,8,0,2,0
.code
start:
mov ax,@data
mov ds,ax
mov сx,len
xor ax,ax
xor si,si
jcxz exit
cycl:
cmp mas[si],0
jne ml
inc al
ml:
inc si
loop cycl
exit:
mov ax,4c00h
int 21h
end start
У команды JCXZ осталась только одна функция – не допустить выполнения «пустого» цикла, поэтому несколько изменилось ее место в тексте программы: теперь она стоит перед меткой начала цикла cycl. Изменение и контроль содержимого регистра СХ в процессе выполнения каждой итерации выполняет команда LOOP.
Принципы организации вложенных циклов.
Основная проблема, которая при этом возникает, – как сохранить значения счетчиков в регистре СХ для каждого из циклов. Для временного сохранения счетчика внешнего цикла на время выполнения внутреннего доступно несколько способов: задействовать регистры, ячейки памяти или стек. В следующем фрагменте программы имеется три цикла, вложенные один в другой. Этот фрагмент можно рассматривать как шаблон для построения других программ с вложенными циклами.
…
mov сх,100 ;количество повторений цикла cycl_l
cycl_l :
push сх ;счетчик цикла cycl_l в стек
….. ;команды цикла cycl_l
mov сх,50 ;количество повторений цикла cycl_2
cycl_2:
push сх ;счетчик цикла cycl_2 в стек
..... ;команды цикла cycl_2
mov сх,25 ;количество повторений цикла cycl_3
cycl_3:
..... ;команды цикла cycl_3
loop cycl_3
... ;команды цикла cycl_2
pop сх ;восстановить счетчик цикла cycl_2
loop cycl_2
... ;команды цикла cycl_l
pop сх ;восстановить счетчик цикла cycl_l
loop cycl_l
…
Пример фрагмента программы, которая обрабатывает специальным образом некоторую область памяти. Область памяти рассматривается как совокупность пяти полей, содержащих 10 однобайтовых элементов. Требуется заменить все нулевые байты в этой области значением 0ffh.
model small
.stack 100h
.data
mas db 1,0,9,8,0,7,8,0,2,0
db 1,0,9,8,0,7,8,0,2,0
db 1,0,9,8,0,7,8,0,2,0
db 1 0,9,8,0,7,8,0,2,0
db 1,0,9,8,0,7,8,0,2,0
. code
start:
mov ax,@data
mov ds,ax
xor ax, ax
lea bx, mas
mov сx, 5
cycl_l:
push сx
xor si, si
mov cx, 10
cycl_2:
cmp byte ptr [bx+si] ,0
jne no_zero
mov byte ptr [bx+si] ,0ffh
no_zero:
inc si
loop cycl_2
pop cx
add bx, 10
loop cycl_l
exit:
mov ax, 4c00h
int 21h
end start
ЛИТЕРАТУРА
Юров, В.И. Assembler. Учебник для вузов / В. И. Юров. – 2-е изд. – СПб. : Питер, 2006. – 637 с.
Голубь, Н. Г. Искусство программирования на Ассемблере / Н. Г. Глубь. – СПб. : ООО «ДиаСофтЮП», 2002. – 656 с.
Калашников, О.А. Ассемблер? Это просто! Учимся программировать / О. А. Калашников. – СПб. : БХВ-Петербург, 2005. – 384 с.
Финогенов, К.Г. Основы языка Ассемблера / К.Г.Финогенов. – М.: Радио и связь, 1999. – 28S с.
Абель, П. Язык Ассемблера для IBM PC и приложения / П.Абель. – М. : «Радио и связь», 1991. – 447 с.
Скэплон, Л. Персональные ЭВМ IBM PC и XT. Программирование на языке Ассемблер / Л. Скеплон. – М. : «Радио и связь», 1989. – 336 с.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 3
ЭТАПЫ РАЗВИТИЯ ЭВМ 4
МАШИННО-ОРИЕНТИРОВАННЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ 6
АРХИТЕКТУРА ЭВМ 8
МИКРОПРОЦЕССОРЫ INTEL 9
НАБОР РЕГИСТРОВ 12
ОРГАНИЗАЦИЯ ПАМЯТИ 17
ТИПЫ ДАННЫХ 19
ФОРМАТ КОМАНД 22
ОБРАБОТКА ПРЕРЫВАНИЙ 24
СИНТАКСИС АССЕМБЛЕРА 29
ДИРЕКТИВЫ СЕГМЕНТАЦИИ 31
ДИРЕКТИВЫ РЕЗЕРВИРОВАНИЯ И ИНИЦИАЛИЗАЦИИ ДАННЫХ 37
СПОСОБЫ ЗАДАНИЯ ОПЕРАНДОВ 41
ОПЕРАТОРЫ 45
ФУНКЦИОНАЛЬНАЯ КЛАССИФИКАЦИЯ МАШИННЫХ КОМАНД 49
КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ 49
АРИФМЕТИЧЕСКИЕ КОМАНДЫ 61
ЛОГИЧЕСКИЕ КОМАНДЫ 69
КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ 72
ОРГАНИЗАЦИЯ ЦИКЛОВ 77
ЛИТЕРАТУРА 83
1. Юров, В.И. Assembler. Учебник для вузов / В. И. Юров. – 2-е изд. – СПб. : Питер, 2006. – 637 с. 83
1. Калашников, О.А. Ассемблер? Это просто! Учимся программировать / О. А. Калашников. – СПб. : БХВ-Петербург, 2005. – 384 с. 83
2. Финогенов, К.Г. Основы языка Ассемблера / К.Г.Финогенов. – М.: Радио и связь, 1999. – 28S с. 83
3. Абель, П. Язык Ассемблера для IBM PC и приложения / П.Абель. – М. : «Радио и связь», 1991. – 447 с. 83
2. Скэплон, Л. Персональные ЭВМ IBM PC и XT. Программирование на языке Ассемблер / Л. Скеплон. – М. : «Радио и связь», 1989. – 336 с. 83
Учебное издание