Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша - Ассемблер в примерах и задачах
Название: | Ассемблер в примерах и задачах | |
Автор: | Наталья Юрьевна Добровольская , Олег Васильевич Гаркуша | |
Жанр: | Учебники и самоучители по компьютеру, Программирование: прочее, Assembler | |
Изадано в серии: | неизвестно | |
Издательство: | Кубанский государственный университет | |
Год издания: | 2022 | |
ISBN: | 978-5-8209-2052-3 | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Ассемблер в примерах и задачах"
Изложены фундаментальные темы: организация современного компьютера, устройство процессоров семейства IA-32, синтаксис языка ассемблера, макросредства, программирование типовых управляющих структур, сложные структуры данных, оптимизация программ. Приведены многочисленные примеры, иллюстрирующие материал. Адресуется студентам факультета компьютерных технологий и прикладной математики, изучающим основы программирования.
Читаем онлайн "Ассемблер в примерах и задачах". [Страница - 13]
которое заранее неизвестно
; Знаковое расширение EAX в EDX:EAX
В языке ассемблера существуют также команды,
позволяющие занести в регистр значение другого регистра или
ячейки памяти со знаковым или беззнаковым расширением.
MOVSX op1, op2; Заполнение знаковым битом
MOVZX op1, op2; Старшие биты заполняются нулём
op1, op2 могут иметь любой размер. Понятно, что op1 должен
быть больше, чем op2. В случае равенства размера операндов
следует использовать обычную команду пересылки MOV, которая
выполняется быстрее.
4.7. КОМАНДЫ УМНОЖЕНИЯ И ДЕЛЕНИЯ
В отличие от сложения и вычитания, умножение и деление
для беззнаковых и знаковых чисел выполняются по разным
алгоритмам.
4.7.1. Команды умножения
Операции умножения для беззнаковых данных выполняются
командой MUL1, а для знаковых – IMUL2.
1
2
Multiply – умножение.
Integer multiply – целочисленное умножение.
42
Команды умножения и деления
Эти команды реализованы для процессора 80186+.
MUL op ; умножение целых без знака
IMUL op ; умножение целых со знаком
Если размерность операнда op 8 бит, то команды MUL и IMUL
умножают содержимого регистра AL на значение операнда и
помещают результат в регистр AX.
Если операнд – 16-битное слово, команды MUL и IMUL
умножают содержимого регистра AX на значение операнда и
помещают результат в пару регистров DX:AX.
Если операнд – двойное слово, команды MUL и IMUL
умножают содержимого регистра EAX на значение операнда и
помещают результат в пару регистров EDX:EAX.
Команда знакового умножения имеет еще две формы.
IMUL op1, op2; op1 = op1 * op2
op1: (r16, r32)
op2: (r16, m16, r32, m32, i8, i16, i32)
Команда выполняет умножение первого операнда на второй
и помещает результат в первый операнд.
Разрядность операндов должна совпадать. Исключением
является использование в качестве второго операнда
непосредственного 8-битного значения.
IMUL op1, op2, op3; op1 = op2 * op3
op1: (r16, r32)
op2: (r16, m16, r32, m32)
op3: (i8, i16, i32)
Команда выполняет умножение второго операнда на третий
операнд и помещает результат в первый операнд.
Разрядность операндов должна совпадать. Исключением
является использование в качестве второго операнда
непосредственного 8-битного значения.
Ответственность за контроль над форматом обрабатываемых
чисел и за выбор подходящей команды умножения лежит на
программисте.
; Пример использования MUL, IMUL
43
Ассемблер в примерах и задачах
.686
include /masm32/include/io.asm
.data
A_DB DB ?
A_DW DW ?
.code
start:
; MUL op = = = = = = = = = = = = = = = = = = = = = =
println "MUL op ; AX = AL * op"
; op1 (r8, r16, r32)
MOV AL,
15
MOV A_DB, 3
print "Res = "
outint8 AL
print "*"
outint8 A_DB
print " = "
MUL A_DB
; AX = AL * A_DB
outint16 AX
newline
MOV AL, -15
MOV A_DB, 3
print "Res = "
outint8 AL
print "*"
outint8 A_DB
print " = "
MUL A_DB
; AX = AL * A_DB
outint16 AX
println "
!!! MUL для op меньше 0 не работает"
newline
; IMUL op1, op2 = = = = = = = = = = = = = = = = = =
println "IMUL op1, op2;
op1 = op1 * op2"
; op1: (r16)
; op2: (r16)
MOV AX, 15
MOV BX, 3
print "Res = "
outint16 AX
print "*"
outint16 BX
44
Команды умножения и деления
print " = "
IMUL AX, BX
outint16 AX
newline
; AX = AX * BX
MOV EAX, 15
MOV EBX, -3
print "Res = "
outint32 EAX
print "*"
outint32 EBX
print " = "
IMUL EAX, EBX
outint32 EAX
newline
; EAX = EAX * EBX
; IMUL op1, op2, op3;
op1 = op2 * op3 = = = = = =
println "IMUL op1, op2, op3; op1 = op2 * op3"
; op1: (r8, r16, r32)
; op2: (i8, i16, i32)
; op3: (r8, r16, r32), (m8,m16,m32), (i8,i16,i32)
MOV AX, 15
MOV A_DW, 3
print "Res = "
outint16 AX
print "*"
outint16 A_DW
print " = "
IMUL BX, AX, 3
outint16 BX
newline
inkey
exit
end start
; BX = AX * 3
; ожидание нажатия клавиши
45
Ассемблер в примерах и задачах
Команда MUL при AL = –15 и op=3 дает результат 723, так как
отрицательное значение –15 представлено в дополнительном коде:
15
Прямой код
00001111(2)
Инверсия
11110000(2)
+1
–15 Дополнительный код
11110001(2) = F1h
В десятичной системе счисления: F1h = 15*16+1 = 241(10),
тогда умножение 241*3=723.
4.7.2. Команды деления
Как и умножение, деление чисел без знака и со знаком также
реализуется двумя командами:
DIV1 op ; деление целых без знака
IDIV2 op ; деление целых со знаком
Деление слова на байт (op DB ?):
AH = АХ % op,
AL = AX / op
Деление двойного слова на слово (op DW ?):
DX = (DX,AX) % op,
AX = (DX,AX) / op
Деление четверного слова на двойное слово (op DD ?):
EDX=(EDX:EAX) % op,
EAX=(EDX:EAX) / op
При делении слова на байт делимое находится в регистре АХ,
а делитель – в байте памяти или в однобайтовом регистре. После
деления остаток получается в регистре АН, а частное – в АL. Так как
однобайтовое частное очень мало – максимально 255 --">
; Знаковое расширение EAX в EDX:EAX
В языке ассемблера существуют также команды,
позволяющие занести в регистр значение другого регистра или
ячейки памяти со знаковым или беззнаковым расширением.
MOVSX op1, op2; Заполнение знаковым битом
MOVZX op1, op2; Старшие биты заполняются нулём
op1, op2 могут иметь любой размер. Понятно, что op1 должен
быть больше, чем op2. В случае равенства размера операндов
следует использовать обычную команду пересылки MOV, которая
выполняется быстрее.
4.7. КОМАНДЫ УМНОЖЕНИЯ И ДЕЛЕНИЯ
В отличие от сложения и вычитания, умножение и деление
для беззнаковых и знаковых чисел выполняются по разным
алгоритмам.
4.7.1. Команды умножения
Операции умножения для беззнаковых данных выполняются
командой MUL1, а для знаковых – IMUL2.
1
2
Multiply – умножение.
Integer multiply – целочисленное умножение.
42
Команды умножения и деления
Эти команды реализованы для процессора 80186+.
MUL op ; умножение целых без знака
IMUL op ; умножение целых со знаком
Если размерность операнда op 8 бит, то команды MUL и IMUL
умножают содержимого регистра AL на значение операнда и
помещают результат в регистр AX.
Если операнд – 16-битное слово, команды MUL и IMUL
умножают содержимого регистра AX на значение операнда и
помещают результат в пару регистров DX:AX.
Если операнд – двойное слово, команды MUL и IMUL
умножают содержимого регистра EAX на значение операнда и
помещают результат в пару регистров EDX:EAX.
Команда знакового умножения имеет еще две формы.
IMUL op1, op2; op1 = op1 * op2
op1: (r16, r32)
op2: (r16, m16, r32, m32, i8, i16, i32)
Команда выполняет умножение первого операнда на второй
и помещает результат в первый операнд.
Разрядность операндов должна совпадать. Исключением
является использование в качестве второго операнда
непосредственного 8-битного значения.
IMUL op1, op2, op3; op1 = op2 * op3
op1: (r16, r32)
op2: (r16, m16, r32, m32)
op3: (i8, i16, i32)
Команда выполняет умножение второго операнда на третий
операнд и помещает результат в первый операнд.
Разрядность операндов должна совпадать. Исключением
является использование в качестве второго операнда
непосредственного 8-битного значения.
Ответственность за контроль над форматом обрабатываемых
чисел и за выбор подходящей команды умножения лежит на
программисте.
; Пример использования MUL, IMUL
43
Ассемблер в примерах и задачах
.686
include /masm32/include/io.asm
.data
A_DB DB ?
A_DW DW ?
.code
start:
; MUL op = = = = = = = = = = = = = = = = = = = = = =
println "MUL op ; AX = AL * op"
; op1 (r8, r16, r32)
MOV AL,
15
MOV A_DB, 3
print "Res = "
outint8 AL
print "*"
outint8 A_DB
print " = "
MUL A_DB
; AX = AL * A_DB
outint16 AX
newline
MOV AL, -15
MOV A_DB, 3
print "Res = "
outint8 AL
print "*"
outint8 A_DB
print " = "
MUL A_DB
; AX = AL * A_DB
outint16 AX
println "
!!! MUL для op меньше 0 не работает"
newline
; IMUL op1, op2 = = = = = = = = = = = = = = = = = =
println "IMUL op1, op2;
op1 = op1 * op2"
; op1: (r16)
; op2: (r16)
MOV AX, 15
MOV BX, 3
print "Res = "
outint16 AX
print "*"
outint16 BX
44
Команды умножения и деления
print " = "
IMUL AX, BX
outint16 AX
newline
; AX = AX * BX
MOV EAX, 15
MOV EBX, -3
print "Res = "
outint32 EAX
print "*"
outint32 EBX
print " = "
IMUL EAX, EBX
outint32 EAX
newline
; EAX = EAX * EBX
; IMUL op1, op2, op3;
op1 = op2 * op3 = = = = = =
println "IMUL op1, op2, op3; op1 = op2 * op3"
; op1: (r8, r16, r32)
; op2: (i8, i16, i32)
; op3: (r8, r16, r32), (m8,m16,m32), (i8,i16,i32)
MOV AX, 15
MOV A_DW, 3
print "Res = "
outint16 AX
print "*"
outint16 A_DW
print " = "
IMUL BX, AX, 3
outint16 BX
newline
inkey
exit
end start
; BX = AX * 3
; ожидание нажатия клавиши
45
Ассемблер в примерах и задачах
Команда MUL при AL = –15 и op=3 дает результат 723, так как
отрицательное значение –15 представлено в дополнительном коде:
15
Прямой код
00001111(2)
Инверсия
11110000(2)
+1
–15 Дополнительный код
11110001(2) = F1h
В десятичной системе счисления: F1h = 15*16+1 = 241(10),
тогда умножение 241*3=723.
4.7.2. Команды деления
Как и умножение, деление чисел без знака и со знаком также
реализуется двумя командами:
DIV1 op ; деление целых без знака
IDIV2 op ; деление целых со знаком
Деление слова на байт (op DB ?):
AH = АХ % op,
AL = AX / op
Деление двойного слова на слово (op DW ?):
DX = (DX,AX) % op,
AX = (DX,AX) / op
Деление четверного слова на двойное слово (op DD ?):
EDX=(EDX:EAX) % op,
EAX=(EDX:EAX) / op
При делении слова на байт делимое находится в регистре АХ,
а делитель – в байте памяти или в однобайтовом регистре. После
деления остаток получается в регистре АН, а частное – в АL. Так как
однобайтовое частное очень мало – максимально 255 --">
Книги схожие с «Ассемблер в примерах и задачах» по жанру, серии, автору или названию:
Арнольд Роббинс - Linux программирование в примерах Жанр: Другие языки и системы программирования Год издания: 2005 |
Владислав Юрьевич Пирогов - Ассемблер и дизассемблирование Жанр: Учебники и самоучители по компьютеру Год издания: 2006 |
Константин Андреевич Басов - ANSYS в примерах и задачах Жанр: Учебники и самоучители по компьютеру Год издания: 2002 |