Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша - Ассемблер в примерах и задачах
Название: | Ассемблер в примерах и задачах | |
Автор: | Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша | |
Жанр: | Учебники и самоучители по компьютеру, Программирование: прочее, Assembler | |
Изадано в серии: | неизвестно | |
Издательство: | Кубанский государственный университет | |
Год издания: | 2022 | |
ISBN: | 978-5-8209-2052-3 | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Ассемблер в примерах и задачах"
Изложены фундаментальные темы: организация современного компьютера, устройство процессоров семейства IA-32, синтаксис языка ассемблера, макросредства, программирование типовых управляющих структур, сложные структуры данных, оптимизация программ. Приведены многочисленные примеры, иллюстрирующие материал. Адресуется студентам факультета компьютерных технологий и прикладной математики, изучающим основы программирования.
Читаем онлайн "Ассемблер в примерах и задачах". [Страница - 16]
вперед
или назад. Это примерно 30–40 команд (в среднем одна команда
ПК занимает 3–4 байта).
Для реализации длинных условных переходов надо
привлекать команду длинного безусловного перехода. Например,
при «далекой» метке М оператор
if AX=BX then
goto M
следует реализовывать так:
if АХВХ
goto M
L:
…
…
M:
…
then
goto
L ; Короткий переход
; Длинный переход
На ЯА это записывается следующим образом:
CMP AX, BX
JNE L
JMP M
L:
…
…
M:
…
; Короткий переход
; Длинный переход
55
Ассемблер в примерах и задачах
Отметим, что использовать в командах условного перехода
оператор SHORT не надо, так как все эти переходы и так короткие.
Пример 5. Дана последовательность чисел. Признак
завершения ввода — 0. Найти количество чисел, кратных 3.
A
K
TRI
DW ? ; Переменная для ввода числа
DW 0 ; Результат – количество чисел
DB 3 ; Делитель
L1: ; Ввод числа а
CMP A, 0
; Проверка на окончание ввода
JE EX
MOV AX, A
DIV TRI
; Проверка свойства кратности 3
CMP AH,0
JNE L2
INC K
; Подсчет количества
L2: JMP L1
EX: ; Вывод числа k
Рассмотренный пример некорректно работает при вводе
отрицательных чисел. Модифицируем пример так, чтобы
отрицательное число перед проверкой на кратность изменяло знак.
Пример 6.
A
K
TRI
DW ? ; переменная для ввода числа
DW 0 ; результат – количество чисел
DB 3 ; делитель
L1: ; Ввод числа A
CMP A, 0
JE EXIT
JGE L3
NEG A
; Если A < 0, то меняем знак
L3:
MOV AX, A
DIV TRI
CMP AH, 0
JNE L2
INC K
L2:
JMP L1
EXIT: ; Вывод числа k
56
Команды сравнения и условного перехода
Пример 7. Найти сумму цифр заданного натурального числа.
.686
include /masm32/include/io.asm
.data
MsgInput db "Введите положительное число > ",0
MsgOutput db "Сумма цифр равна ",0
ten dw 10
.code
start:
print "Введите положительное число > "
inint EAX
; Ввод числа
MOV EBX,
L:
MOV EDX,
DIV ten
ADD EBX,
цифру)
CMP EAX,
jne L
0
; EBX = 0
0
; Делим EDX:EAX
; на 10
; Прибавляем остаток (последнюю
EDX
0
; Если число не равно нулю, то
; возврат к метке L
print "Сумма цифр равна "
outint EBX
; вывод результата
exit
end start
Пример 8.
Дано
натуральное число
N.
Дана
последовательность, состоящая из N чисел. Найти количество
чисел, кратных пяти.
.686
include /masm32/include/io.asm
.data
MsgInput db "Введите количество элементов
последовательности > ",0
MsgInput2 db "Введите элементы > ",0
MsgOutput db "Количество : ",0
five dw 5
a dd ?
N dd ?
count dd ?
.code
start:
print "Количество элементов последовательности >"
inint N
; Ввод N
57
Ассемблер в примерах и задачах
print "Введите
MOV ECX, N
;
MOV count, 0 ;
L:
inint a
;
MOV EDX, 0
MOV EAX, a
;
DIV five
;
CMP EDX, 0
;
JNE LL
;
INC count
;
LL: LOOP L
элементы > "
Число повторений цикла
Обнуляем счетчик
Ввод элемента
Деление элемента
на 5
Если не делится нацело,
то переход в конец цикла,
иначе увеличиваем количество
; следующая итерация цикла
; (возврат к метке L)
print "Количество : "
outint count ; вывод результата
exit
end start
5.3. ВЫЧИСЛЕНИЕ ЛОГИЧЕСКИХ ВЫРАЖЕНИЙ
При программировании на ЯА сложных булевских
выражений можно обойтись без логических команд, достаточно
лишь команд сравнения и условных переходов. Например,
условный оператор
if (AX>0) or (DX=l) then goto L
можно запрограммировать так:
CMP
JG
CMP
JE
AX, 0
L
DX, 1
L
; AХ>0 → L
; DX=1 → L
Для оператора
if (AX > 0) && (DX = 0) {
goto L
}
допустима такая последовательность команд:
CMP
JLE
CMP
JNE
JMP
AX,
M
DX,
M
L
0
; AХ0)
{ S1 }
else { S2 }
CMP X, 0
JLE L2
S1
JMP Fin
L2: S2
Fin: …
while (X>0)
{ S }
Beg:
CMP X, 0
JLE Fin
S
JMP Beg
Fin: …
do
{ S }
while (X 0) S
; if (A > 0 || B > 0) S
CMP x, 0
JLE L
...
L:
; if (X = 0) S1 else S2
CMP A, 0
JG L1
CMP B, 0
JLE L2
L1: ...
; S
L2:
; if (A > 0 && B > 0) S
CMP X, 0
JE L1
...
JMP L2
L1:
L2:
CMP
JLE
CMP
JLE
...
L:
; S
; S1
; S2
59
A, 0
L
B, 0
L
; S
Ассемблер в примерах и задачах
; while (X > 0) do S
; do S while (X > 0)
L1: CMP X, 0
JLE L2
...
JMP L1
L2:
L:
; S
...
CMP X, 0
JG L
; S
5.5. КОМАНДЫ УПРАВЛЕНИЯ ЦИКЛОМ
5.5.1. Команда LOOP
Наиболее часто используемым является цикл с заранее
известным числом повторений тела цикла.
В качестве счетчика цикла обязательно использовать регистр
CX/ECX. Начальное значение для CX/ECX должно быть присвоено
до цикла.
Описать работу этой команды можно так:
CX = N
L:
… {тело цикла}
CX = CX - 1
if CX 0 then goto --">
или назад. Это примерно 30–40 команд (в среднем одна команда
ПК занимает 3–4 байта).
Для реализации длинных условных переходов надо
привлекать команду длинного безусловного перехода. Например,
при «далекой» метке М оператор
if AX=BX then
goto M
следует реализовывать так:
if АХВХ
goto M
L:
…
…
M:
…
then
goto
L ; Короткий переход
; Длинный переход
На ЯА это записывается следующим образом:
CMP AX, BX
JNE L
JMP M
L:
…
…
M:
…
; Короткий переход
; Длинный переход
55
Ассемблер в примерах и задачах
Отметим, что использовать в командах условного перехода
оператор SHORT не надо, так как все эти переходы и так короткие.
Пример 5. Дана последовательность чисел. Признак
завершения ввода — 0. Найти количество чисел, кратных 3.
A
K
TRI
DW ? ; Переменная для ввода числа
DW 0 ; Результат – количество чисел
DB 3 ; Делитель
L1: ; Ввод числа а
CMP A, 0
; Проверка на окончание ввода
JE EX
MOV AX, A
DIV TRI
; Проверка свойства кратности 3
CMP AH,0
JNE L2
INC K
; Подсчет количества
L2: JMP L1
EX: ; Вывод числа k
Рассмотренный пример некорректно работает при вводе
отрицательных чисел. Модифицируем пример так, чтобы
отрицательное число перед проверкой на кратность изменяло знак.
Пример 6.
A
K
TRI
DW ? ; переменная для ввода числа
DW 0 ; результат – количество чисел
DB 3 ; делитель
L1: ; Ввод числа A
CMP A, 0
JE EXIT
JGE L3
NEG A
; Если A < 0, то меняем знак
L3:
MOV AX, A
DIV TRI
CMP AH, 0
JNE L2
INC K
L2:
JMP L1
EXIT: ; Вывод числа k
56
Команды сравнения и условного перехода
Пример 7. Найти сумму цифр заданного натурального числа.
.686
include /masm32/include/io.asm
.data
MsgInput db "Введите положительное число > ",0
MsgOutput db "Сумма цифр равна ",0
ten dw 10
.code
start:
print "Введите положительное число > "
inint EAX
; Ввод числа
MOV EBX,
L:
MOV EDX,
DIV ten
ADD EBX,
цифру)
CMP EAX,
jne L
0
; EBX = 0
0
; Делим EDX:EAX
; на 10
; Прибавляем остаток (последнюю
EDX
0
; Если число не равно нулю, то
; возврат к метке L
print "Сумма цифр равна "
outint EBX
; вывод результата
exit
end start
Пример 8.
Дано
натуральное число
N.
Дана
последовательность, состоящая из N чисел. Найти количество
чисел, кратных пяти.
.686
include /masm32/include/io.asm
.data
MsgInput db "Введите количество элементов
последовательности > ",0
MsgInput2 db "Введите элементы > ",0
MsgOutput db "Количество : ",0
five dw 5
a dd ?
N dd ?
count dd ?
.code
start:
print "Количество элементов последовательности >"
inint N
; Ввод N
57
Ассемблер в примерах и задачах
print "Введите
MOV ECX, N
;
MOV count, 0 ;
L:
inint a
;
MOV EDX, 0
MOV EAX, a
;
DIV five
;
CMP EDX, 0
;
JNE LL
;
INC count
;
LL: LOOP L
элементы > "
Число повторений цикла
Обнуляем счетчик
Ввод элемента
Деление элемента
на 5
Если не делится нацело,
то переход в конец цикла,
иначе увеличиваем количество
; следующая итерация цикла
; (возврат к метке L)
print "Количество : "
outint count ; вывод результата
exit
end start
5.3. ВЫЧИСЛЕНИЕ ЛОГИЧЕСКИХ ВЫРАЖЕНИЙ
При программировании на ЯА сложных булевских
выражений можно обойтись без логических команд, достаточно
лишь команд сравнения и условных переходов. Например,
условный оператор
if (AX>0) or (DX=l) then goto L
можно запрограммировать так:
CMP
JG
CMP
JE
AX, 0
L
DX, 1
L
; AХ>0 → L
; DX=1 → L
Для оператора
if (AX > 0) && (DX = 0) {
goto L
}
допустима такая последовательность команд:
CMP
JLE
CMP
JNE
JMP
AX,
M
DX,
M
L
0
; AХ0)
{ S1 }
else { S2 }
CMP X, 0
JLE L2
S1
JMP Fin
L2: S2
Fin: …
while (X>0)
{ S }
Beg:
CMP X, 0
JLE Fin
S
JMP Beg
Fin: …
do
{ S }
while (X 0) S
; if (A > 0 || B > 0) S
CMP x, 0
JLE L
...
L:
; if (X = 0) S1 else S2
CMP A, 0
JG L1
CMP B, 0
JLE L2
L1: ...
; S
L2:
; if (A > 0 && B > 0) S
CMP X, 0
JE L1
...
JMP L2
L1:
L2:
CMP
JLE
CMP
JLE
...
L:
; S
; S1
; S2
59
A, 0
L
B, 0
L
; S
Ассемблер в примерах и задачах
; while (X > 0) do S
; do S while (X > 0)
L1: CMP X, 0
JLE L2
...
JMP L1
L2:
L:
; S
...
CMP X, 0
JG L
; S
5.5. КОМАНДЫ УПРАВЛЕНИЯ ЦИКЛОМ
5.5.1. Команда LOOP
Наиболее часто используемым является цикл с заранее
известным числом повторений тела цикла.
В качестве счетчика цикла обязательно использовать регистр
CX/ECX. Начальное значение для CX/ECX должно быть присвоено
до цикла.
Описать работу этой команды можно так:
CX = N
L:
… {тело цикла}
CX = CX - 1
if CX 0 then goto --">
Книги схожие с «Ассемблер в примерах и задачах» по жанру, серии, автору или названию:
Александр Борисович Крупник - Изучаем Ассемблер Жанр: Школьные учебники и пособия Год издания: 2005 Серия: КомпАс (Школьный клуб Компьютерный ас) |
Коллектив авторов - Rust на примерах Жанр: Учебники и самоучители по компьютеру Год издания: 2011 |
Юрий Степанович Магда - Ассемблер. Разработка и оптимизация Windows-приложений Жанр: Assembler Год издания: 2003 |