Библиотека knigago >> Компьютеры: Языки и системы программирования >> Assembler >> Ассемблер в примерах и задачах

Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша - Ассемблер в примерах и задачах

Ассемблер в примерах и задачах
Книга - Ассемблер в примерах и задачах.  Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша  - прочитать полностью в библиотеке КнигаГо
Название:
Ассемблер в примерах и задачах
Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша

Жанр:

Учебники и самоучители по компьютеру, Программирование: прочее, Assembler

Изадано в серии:

неизвестно

Издательство:

Кубанский государственный университет

Год издания:

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. ПЕРЕХОДЫ И ЦИКЛЫ
Процессор --">

Оставить комментарий:


Ваш e-mail является приватным и не будет опубликован в комментарии.