Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша - Ассемблер в примерах и задачах
Название: | Ассемблер в примерах и задачах | |
Автор: | Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша | |
Жанр: | Учебники и самоучители по компьютеру, Программирование: прочее, Assembler | |
Изадано в серии: | неизвестно | |
Издательство: | Кубанский государственный университет | |
Год издания: | 2022 | |
ISBN: | 978-5-8209-2052-3 | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Ассемблер в примерах и задачах"
Изложены фундаментальные темы: организация современного компьютера, устройство процессоров семейства IA-32, синтаксис языка ассемблера, макросредства, программирование типовых управляющих структур, сложные структуры данных, оптимизация программ. Приведены многочисленные примеры, иллюстрирующие материал. Адресуется студентам факультета компьютерных технологий и прикладной математики, изучающим основы программирования.
Читаем онлайн "Ассемблер в примерах и задачах". [Страница - 17]
L
Тогда повторение N раз (N > 0) некоторой группы команд
(тело цикла) можно реализовать так:
MOV CX/ECX, N
L:
… {тело цикла}
LOOP L
Команда LOOP требует, чтобы в качестве счётчика цикла
использовался регистр CX/ECX. Собственно, команда LOOP
вычитает единицу именно из этого регистра, сравнивает
полученное значение с нулём и осуществляет переход на
указанную метку, если значение в регистре ECX больше 0. Метка
определяет смещение перехода, которое не может превышать 128
байт.
При использовании команды LOOP следует также учитывать,
что с её помощью реализуется цикл с постусловием,
60
Команды управления циклом
следовательно, тело цикла выполняется хотя бы один раз. Если до
начала цикла записать в регистр CX/ECX значение ≤ 0, то при
вычитании единицы, которое выполняется до сравнения с нулём,
в регистре CX/ECX окажется ненулевое значение, и цикл будет
выполняться 232 раз.
Команда LOOP не относится к самым быстрым командам. В
большинстве случаев её можно заменить последовательностью
других команд.
Поскольку команда LOOP ставится в конце цикла, то тело
цикла хотя бы раз обязательно выполнится. Поэтому для случая
EСХ = 0 наша схема цикла не подходит. Если возможен вариант,
когда число повторений может быть и нулевым, то при EСХ = 0
надо сделать обход цикла:
MOV
JECXZ
L:
…
LOOP
L1: …
ECX, N
L1
; ECX=0 -> L1;
; тело цикла
L
Для осуществления таких обходов в ПК была введена
команда условного перехода JECXZ. В иных ситуациях она
используется редко.
Рассмотрим пример использования команды LOOP.
Пример 9. Пусть X и Y – байтовые переменные со значением
от 0 до 6 и надо в регистр АХ записать степень Y числа X: АХ = XY
(отметим, что 66 = 46656 < 216).
Для решения этой задачи надо вначале положить АХ = 1, а
затем Y раз выполнить умножение AX = AX*X. При этом следует
учитывать, что при Y = 0 цикл не должен выполняться.
MOV АХ, 1
MOV CL, Y
MOV CH, 0
JCXZ L1
MOV SI, X
L: MOV DX, 0
MUL SI
LOOP L
; AX=1
; CX=Y как слово (счетчик цикла)
; При N=0 обойти цикл
; (DX,AX)=AX*X (DX=0)
61
Ассемблер в примерах и задачах
L1:
…
Другой пример использования оператора цикла в программе
— обработка последовательности чисел.
Пример 10. Дана последовательность из N чисел. Найти
сумму положительных чисел последовательности.
A
S
N
DW ?
DW 0
DW ?
MOV CX, N
; Ввод количества чисел N
L1: ; Ввод числа а
CMP A, 0
;если N / 2
EDX
N
0
; Если делитель = > N - составное
2
; Проверяем только нечетные
68
L02:
MOV F, 0
; Устанавливаем флаг в 0
L03:
}
cout --">
Тогда повторение N раз (N > 0) некоторой группы команд
(тело цикла) можно реализовать так:
MOV CX/ECX, N
L:
… {тело цикла}
LOOP L
Команда LOOP требует, чтобы в качестве счётчика цикла
использовался регистр CX/ECX. Собственно, команда LOOP
вычитает единицу именно из этого регистра, сравнивает
полученное значение с нулём и осуществляет переход на
указанную метку, если значение в регистре ECX больше 0. Метка
определяет смещение перехода, которое не может превышать 128
байт.
При использовании команды LOOP следует также учитывать,
что с её помощью реализуется цикл с постусловием,
60
Команды управления циклом
следовательно, тело цикла выполняется хотя бы один раз. Если до
начала цикла записать в регистр CX/ECX значение ≤ 0, то при
вычитании единицы, которое выполняется до сравнения с нулём,
в регистре CX/ECX окажется ненулевое значение, и цикл будет
выполняться 232 раз.
Команда LOOP не относится к самым быстрым командам. В
большинстве случаев её можно заменить последовательностью
других команд.
Поскольку команда LOOP ставится в конце цикла, то тело
цикла хотя бы раз обязательно выполнится. Поэтому для случая
EСХ = 0 наша схема цикла не подходит. Если возможен вариант,
когда число повторений может быть и нулевым, то при EСХ = 0
надо сделать обход цикла:
MOV
JECXZ
L:
…
LOOP
L1: …
ECX, N
L1
; ECX=0 -> L1;
; тело цикла
L
Для осуществления таких обходов в ПК была введена
команда условного перехода JECXZ. В иных ситуациях она
используется редко.
Рассмотрим пример использования команды LOOP.
Пример 9. Пусть X и Y – байтовые переменные со значением
от 0 до 6 и надо в регистр АХ записать степень Y числа X: АХ = XY
(отметим, что 66 = 46656 < 216).
Для решения этой задачи надо вначале положить АХ = 1, а
затем Y раз выполнить умножение AX = AX*X. При этом следует
учитывать, что при Y = 0 цикл не должен выполняться.
MOV АХ, 1
MOV CL, Y
MOV CH, 0
JCXZ L1
MOV SI, X
L: MOV DX, 0
MUL SI
LOOP L
; AX=1
; CX=Y как слово (счетчик цикла)
; При N=0 обойти цикл
; (DX,AX)=AX*X (DX=0)
61
Ассемблер в примерах и задачах
L1:
…
Другой пример использования оператора цикла в программе
— обработка последовательности чисел.
Пример 10. Дана последовательность из N чисел. Найти
сумму положительных чисел последовательности.
A
S
N
DW ?
DW 0
DW ?
MOV CX, N
; Ввод количества чисел N
L1: ; Ввод числа а
CMP A, 0
;если N / 2
EDX
N
0
; Если делитель = > N - составное
2
; Проверяем только нечетные
68
L02:
MOV F, 0
; Устанавливаем флаг в 0
L03:
}
cout --">
Книги схожие с «Ассемблер в примерах и задачах» по жанру, серии, автору или названию:
Коллектив авторов - Rust на примерах Жанр: Учебники и самоучители по компьютеру Год издания: 2011 |
Юрий Степанович Магда - Ассемблер. Разработка и оптимизация Windows-приложений Жанр: Assembler Год издания: 2003 |
Алексей Николаевич Васильев - Программирование на JavaScript в примерах и задачах Жанр: Java, Java Script Год издания: 2017 Серия: Российский компьютерный бестселлер |