Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша - Ассемблер в примерах и задачах
Название: | Ассемблер в примерах и задачах | |
Автор: | Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша | |
Жанр: | Учебники и самоучители по компьютеру, Программирование: прочее, Assembler | |
Изадано в серии: | неизвестно | |
Издательство: | Кубанский государственный университет | |
Год издания: | 2022 | |
ISBN: | 978-5-8209-2052-3 | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Ассемблер в примерах и задачах"
Изложены фундаментальные темы: организация современного компьютера, устройство процессоров семейства IA-32, синтаксис языка ассемблера, макросредства, программирование типовых управляющих структур, сложные структуры данных, оптимизация программ. Приведены многочисленные примеры, иллюстрирующие материал. Адресуется студентам факультета компьютерных технологий и прикладной математики, изучающим основы программирования.
Читаем онлайн "Ассемблер в примерах и задачах". [Страница - 14]
беззнакового деления и 127 для знакового, то данная операция
имеет ограниченное использование.
При делении двойного слова на слово делимое находится в
регистровой паре DX:АХ, а делитель – в слове памяти или регистре.
После деления остаток получается в регистре DX, а частное – в
1
2
Divide – деление.
Integer divide – целочисленное деление.
46
Команды умножения и деления
регистре АХ. Частное в одном слове допускает максимальное
значение 65535 для беззнакового деления и 32767 для знакового.
В единственном операнде команд DIV и IDIV указывается
делитель.
Пример 2. Использование DIV
.686
include /masm32/include/io.asm
.data
A_DB DB ?
A_DW DW ?
A_DD DD ?
.code
start:
; op DB = = = = = = = = = = = = = = = = = = = = = = =
println "op DB: DIV op ; AH=AX%op
AL=AX/op"
MOV AL, 63 ; AL = 3Fh = 63
MOV A_DB, 5
MOV AH, 0 ; !!!
print "Res = "
outint16 AX
print "/"
outint8 A_DB
print "
:
"
DIV A_DB ; AH = AX%A_DB
print "
AH = "
outint8 AH
print " AL = "
outint8 AL
newline
AL=AX/A_DB
; op DW = = = = = = = = = = = = = = = = = = = = = = =
println "op DW: DIV op; DX=(DX:AX)%op
AX=(DX:AX)/op"
MOV AX, 63 ; AX = 003Fh = 63
MOV A_DW, 5
MOV DX, 0 ; !!!
print "Res = "
outint16 AX
print "/"
outint16 A_DW
print "
:
"
DIV A_DW
; DX=(DX:AX)%A_DW
47
AX=(DX:AX)/A_DW
Ассемблер в примерах и задачах
print "
DX = "
outint16 DX
print " AX = "
outint16 AX
newline
; op DD = = = = = = = = = = = = = = = = = = = = = = =
println "op DD: DIV op; EDX=(EDX:EAX)%op
EAX=(EDX:EAX)/op"
MOV EAX, 63
MOV A_DD, 5
MOV EDX, 0 ; !!!
print "Res = "
outint16 AX
print "/"
outint32 A_DD
print "
:
"
DIV A_DD
; DX = (EDX:EAX) % A_DD
; AX = (EDX:EAX) / A_DD
print "
EDX = "
outint32 EDX
print " EAX = "
outint32 EAX
newline
inkey
exit
end start
; Ожидание нажатия клавиши
Пример 3. Использование IDIV
.686
include /masm32/include/io.asm
; .data - Сегмент данных не описываем,
; т.к. используются регистры
.code
start:
48
Команды умножения и деления
; op DB = = = = = = = = = = = = = = = = = = = = = = =
println "= = =
op DB: IDIV op; AH = AX % op
AL = AX / op"
MOV AL, 63 ; AL = 3Fh = 63
MOV BL, 5
CBW ; Знаковое расширение AL до AX: AX=003Fh = 63
; !!! В данном случае не обязательно !!!
print "Res = "
outint16 AX
print "/"
outint8 BL
print "
:
"
; AX = 003Fh = 63
IDIV
BL
; AH = 03h = 3,
print "
AH = "
outint8 AH
print " AL = "
outint8 AL
newline
AL = 0Ch = 12
; op DW = = = = = = = = = = = = = = = = = = = = = = =
println "= = = op DW: IDIV op; DX = (DX:AX) % op
AX = (DX:AX) / op"
MOV AL, -63 ; AL = C1h = -63
MOV BL, 5
CBW ; Знаковое расширение AL до AX: AX=FFC1h=-63
print "Res = "
outint8 AL
print "/"
outint8 BL
print "
:
"
; AX = FFC1h =
IDIV
BL
;
print "
AH =
outint8 AH, 5
print "
AL =
outint8 AL, 5
newline
-63
AH = 03h = 3,
"
AL = F4h = -12
"
; op DD = = = = = = = = = = = = = = = = = = = = = = =
MOV AX, 63 ; AX = 003Fh = 63
MOV BX, -5
CWD
; Знаковое расширение AX до (DX:AX)=0000003Fh=63
; !!! В данном случае не обязательно !!!
print "Res = "
outint16 AX
print "/"
49
Ассемблер в примерах и задачах
outint16 BX
print "
:
IDIV
BX
print "
AX
outint16 AX,
print "
DX
outint16 DX,
newline
"
; DX = 0003h = 3,
= "
5
= "
5
AX = FFF4h = -12
; op DD = = = = = = = = = = = = = = = = = = = = = = =
println "= = op DD: IDIV op; EDX = (EDX:EAX) % op
EAX = (EDX:EAX) / op"
newline
MOV EAX, -63 ; EAX = FFFF FFC1h = -63
MOV EBX, 5
CDQ ; Знаковое расширение EAX до (EDX:EAX)
; (EDX:EAX) = FFFF FFFF FFFF FFC1h = -63
print "Res = "
outint32 EAX
print "/"
outint32 EBX
print "
:
"
IDIV
EBX ; EDX=FFFF FFFDh=-3, EAX=FFFF FFF4h=-12
print "
EAX = "
outint32 EAX, 5
print "
EDX = "
outint32 EDX, 5
newline
; op DD = = = = = = = = = = = = = = = = = = = = = = =
MOV EAX, 63 ; EAX = 0000 003Fh = 63
MOV EBX, -5
CDQ ; Знаковое расширение EAX до (EDX:EAX)
; (EDX:EAX) = 0000 0000 0000 003Fh = 63
; !!! В данном случае не обязательно !!!
print "Res = "
outint32 EAX
print "/"
outint32 EBX
print "
:
"
IDIV
EBX ; EDX = 0000 0003h=3, EAX=FFFF FFF4h=-12
print "
EAX = "
outint32 EAX, 5
print "
EDX = "
outint32 EDX, 5
50
Команды умножения и деления
newline
inkey
exit
end start
; ожидание нажатия клавиши
Отметим, что при выполнении деления возможно появление
ошибки «деление на 0 или переполнение». Она возникает в двух
случаях:
− делитель равен 0 (ор = 0);
− неполное частное не вмещается в отведенное ему место
(регистр AL или АХ); это, например, произойдет при делении 600
на 2:
MOV АХ, 600
MOV ВН, 2
DIV BH; 600 div 2=300, но 300 не вмещается в AL
При такой ошибке ПК прекращает выполнение программы.
Пример 4. Дано целое трехзначное беззнаковое число. Найти
сумму цифр этого числа.
X
DB ?
Sum DB 0
Ten DB 10
MOV AL, X
SUB AH, AH
DIV Ten
ADD Sum, AH
SUB AH, AH
DIV Ten
ADD Sum, AH
ADD Sum, AL
; Исходное число
;
;
;
;
;
;
;
Деление на 10
AH – последняя цифра
Очистка AH
Деление на 10
AH – средняя цифра
AL – первая цифра числа
Вывод Sum – Сумму цифр числа
51
Ассемблер в примерах и задачах
5. ПЕРЕХОДЫ И ЦИКЛЫ
Процессор --">
Книги схожие с «Ассемблер в примерах и задачах» по жанру, серии, автору или названию:
Коллектив авторов - Rust на примерах Жанр: Другие языки и системы программирования Год издания: 2011 |
Владислав Юрьевич Пирогов - Ассемблер и дизассемблирование Жанр: Учебники и самоучители по компьютеру Год издания: 2006 |
Андрей В. Жуков - Ассемблер Жанр: Учебники и самоучители по компьютеру Год издания: 2002 |
Коллектив авторов - Самое полное руководство по разработке на Python в примерах от сообщества Stack Overflow Жанр: Python Год издания: 2024 Серия: Программирование от экспертов |