
- •Лекция №1. Основные понятия. Первая программа для dos и под Windows. Представление данных в компьютере.
- •Сам ассемблер — программа, которая переводит текст с языка, понятного человеку, в язык, понятный процессору, получает объектный модуль;
- •Компоновщик (linker), который создает исполнимые файлы из одного или нескольких объектных модулей, полученных после запуска ассемблера;
- •Дополнительные вспомогательные программы — компиляторы ресурсов, расширители dos и тому подобное (см. Табл.).
- •Написать её в блокноте, сохранять в *.Asm файл;
- •Из командной строки вызвать ассемблер tasm32.Exe (tasm.Exe);
- •Из командной строки вызвать линковщик tlink32.Exe (tlink.Exe);
- •Процессоры и их регистры
- •Процессоры x86
- •Регистры процессора
- •Описание регистров
- •Задача: найти старшую часть расширенного регистра (eax, ebx, ..., esi, edi)?
- •0030:4012 (Всё шестнадцатиричное)
- •4) Нельзя использовать сегментный регистр cs в качестве операнда назначения.
- •5) Оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:
- •Xchg eax,ebx ; обменять содержимое регистров eax и ebx.
- •Xchg al,al ; а эта команда не делает ничего
- •Xchg ax, word ptr [si] ; обменять содержимое регистра ах и слова в памяти по адресу в [si].
- •Технология sse. Блок xmm
- •Имеются специальные команды сравнения двух вещественных чисел. После их выполнения формируются и помещаются в eflags признаки, характеризующие результат операции.
- •8 Флагов состояния. Эти флаги могут изменяться после выполнения машинных команд;
- •1) Первой известной кодировкой символов была кодировка ascii, и она используется до сих пор. В ascii-кодировке каждый символ занимает 8 бит, или один байт.
- •2. Адресные операнды – задают физическое расположение операнда в памяти с помощью указания двух составляющих адреса: сегмента и смещения. К примеру:
- •6. Структурные операнды используются для доступа к конкретному элементу структуры.
- •7. Записи (аналогично структурному типу) используются для доступа к битовому полю некоторой записи.
- •Команды безусловной передачи управления:
- •Команды условной передачи управления:
- •Команды управления циклом:
- •Лекция № 4. Условные переходы. Арифметиченские команды. Bcd числа.
- •1111111011101101 Инвертируем 0000000100010010
- •Лекция №5. Арифметические команды над целыми числами (продолжение). Арифметические операции над двоично-десятичными числами (bcd числами)
- •К содержимому младшей тетрады al прибавляется 6;
- •Флаг cf устанавливается в 1, тем самым фиксируется перенос в старший разряд для того, чтобы его можно было учесть в последующих действиях.
- •Из содержимого младшей тетрады регистра al вычитается 6;
- •Обнуляется старшая тетраду регистра al;
- •Устанавливает флаг cf в 1, фиксируя воображаемый заём из старшего разряда.
- •Делит ax на 10;
- •Результат деления записывается так: частное – в ah, остаток в al.
- •1) Преобразует двузначное неупакованное bcd-число в регистре ах в двоичное число;
- •2) Полученное двоичное число используется в качестве делимого в операции деления;
- •3) Полученное двоичное число помещается в регистр aх.
- •Деление с остатком
- •Блок-схема вывода результата при делении с остатком Числа с плавающей запятой. Работа с сопроцессором
- •Число имеет вид 1,1100011 × 2-1 или 0,11100011.
- •Переводом в десятичную систему счисления получаем 0,88671875. Лекция №6. Работа с сопроцессором. Команды для работы с fpu. Работа с fpu.
- •Блок-схема вывода на экран вещественного числа, которое хранится в регистре st(0) сопроцессора.
- •Деление с остатком, используя команды целочисленного деления
- •Блок-схема вывода результата при делении с остатком Трансцендентные операции fpu
- •Массивы
- •Перечислением элементов массива в поле операндов одной из директив описания данных. Например:
- •Используя оператор повторения dup. К примеру:
- •4) Mov esi,6*2 ; 2 байта – размер элементов
- •Индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
- •Базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
- •Структуры
- •Организовать обращение к элементам структуры.
- •Цепочечные команды или команды обработки строк символов
- •Организация обращения к элементам записи.
- •Iotest record
- •Работа с записями
- •1) Для выделения элемента записи необходимо:
- •2) Чтобы поместить измененный элемент на его место в запись необходимо:
- •3. В конце работы файл следует закрыть.
- •4. Признаком ошибки при выполнении функции dos является взведенный флаг с (переноса).
- •2. Создание файла с усечением существующего до нулевой длины.
- •LpFileName — указатель на asciiz-строку с именем (путем) открываемого или создаваемого файла;
- •DwDesiredAccess — тип доступа к файлу:
- •4) Mov esi,6*2 ; 2 байта – размер элементов
- •Индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
- •Базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
- •Структуры
- •Организовать обращение к элементам структуры.
- •Цепочечные команды или команды обработки строк символов
- •Организация обращения к элементам записи.
- •Iotest record
- •Работа с записями
- •1) Для выделения элемента записи необходимо:
- •2) Чтобы поместить измененный элемент на его место в запись необходимо:
- •3. В конце работы файл следует закрыть.
- •4. Признаком ошибки при выполнении функции dos является взведенный флаг с (переноса).
- •2. Создание файла с усечением существующего до нулевой длины.
- •LpFileName — указатель на asciiz-строку с именем (путем) открываемого или создаваемого файла;
- •DwDesiredAccess — тип доступа к файлу:
- •3) Создать и открыть новый файл
- •4) Чтение из файла или устройства
- •5) Переместить указатель чтения/записи
- •1) HFile – хэндл того файла, в котором перемещается указатель.
- •7) Запись в файл или устройство
- •8) Закрыть файл
- •9) Удаление файла
- •Функция 01h – ожидание ввода символа с эхопечатью
- •Функция 0ah – получение строки символов
- •1) Создать каталог
- •2) Удалить каталог
- •5) Определить текущий каталог
- •Перечень функций прерывания 21h, работающих с файлами, которые имеют длинные имена и соответствующие функции api Win32.
- •Перечислим функции api Win32, имеющие отношение к работе с файловой системой.
- •1) В Win32 получить время создания, время последнего доступа и время последней модификации файла можно с помощью функции GetFileTime.
- •3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:
- •Int 10h ; вызов прерывания bios
- •Основные графические режимы vga
- •Int 10h ; считываем символ и его атрибут
- •Стандартные цветовые палитры в режимах 4,5,6.
- •02H/03h - Чтение/запись секторов.
- •Прямое программирование видеобуфера в текстовом режиме
- •Лекция №6. Работа с сопроцессором. Команды для работы с fpu. Работа с fpu.
- •Лабораторная работа №12. Тема: Графические видеорежимы. Работа с vga-режимами
- •Лабораторная работа № 8. Тема: Работа с файлами
- •Лабораторная работа №5. Тема: Работа с массивами
- •Лекция №1. Основные понятия. Первая программа для dos и под Windows. Представление данных в компьютере.
- •Сам ассемблер — программа, которая переводит текст с языка, понятного человеку, в язык, понятный процессору, получает объектный модуль;
- •Компоновщик (linker), который создает исполнимые файлы из одного или нескольких объектных модулей, полученных после запуска ассемблера;
- •Дополнительные вспомогательные программы — компиляторы ресурсов, расширители dos и тому подобное (см. Табл.).
- •Написать её в блокноте, сохранять в *.Asm файл;
- •Из командной строки вызвать ассемблер tasm32.Exe (tasm.Exe);
- •Из командной строки вызвать линковщик tlink32.Exe (tlink.Exe);
- •Процессоры и их регистры
- •Процессоры x86
- •Регистры процессора
- •Описание регистров
- •Задача: найти старшую часть расширенного регистра (eax, ebx, ..., esi, edi)?
- •0030:4012 (Всё шестнадцатиричное)
- •4) Нельзя использовать сегментный регистр cs в качестве операнда назначения.
- •5) Оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:
- •Xchg eax,ebx ; обменять содержимое регистров eax и ebx.
- •Xchg al,al ; а эта команда не делает ничего
- •Xchg ax, word ptr [si] ; обменять содержимое регистра ах и слова в памяти по адресу в [si].
- •Технология sse. Блок xmm
- •Имеются специальные команды сравнения двух вещественных чисел. После их выполнения формируются и помещаются в eflags признаки, характеризующие результат операции.
- •8 Флагов состояния. Эти флаги могут изменяться после выполнения машинных команд;
- •1) Первой известной кодировкой символов была кодировка ascii, и она используется до сих пор. В ascii-кодировке каждый символ занимает 8 бит, или один байт.
- •2. Адресные операнды – задают физическое расположение операнда в памяти с помощью указания двух составляющих адреса: сегмента и смещения. К примеру:
- •5. Структурные операнды используются для доступа к конкретному элементу структуры.
- •6. Записи (аналогично структурному типу) используются для доступа к битовому полю некоторой записи.
- •Команды безусловной передачи управления:
- •Команды условной передачи управления:
- •Команды управления циклом:
- •От типа операнда в команде безусловного перехода (ближний или дальний);
- •Лабораторная работа №1. Тема: знакомство с системой программирования Турбо-ассемблер.
- •1) Пересылка данных
- •2) Xor логическое исключающее или
- •3) Команды передачи управления
- •Задание для самостоятельной работы
- •Лабораторная работа №1. Тема: знакомство с системой программирования Турбо-ассемблер.
- •1) Пересылка данных
- •2) Xor логическое исключающее или
- •3) Команды передачи управления
- •Команды вычитания.
- •Команды умножения.
- •Команда деления
- •Команды преобразования
- •Команды сдвига
- •Задание для самостоятельной работы.
- •Лабораторная работа №4. Тема: перевод чисел из шестнадцатиричной системы исчисления в десятичную и в двоичную.
- •Задание для самостоятельной работы.
- •Лекция №10. Сложные структуры данных. Массивы. Структуры.
- •4) Mov esi,6*2 ; 2 байта – размер элементов
- •Индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
- •Базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
- •Структуры
- •Организовать обращение к элементам структуры.
- •Цепочечные команды или команды обработки строк символов
- •Организация обращения к элементам записи.
- •Iotest record
- •Работа с записями
- •1) Для выделения элемента записи необходимо:
- •2) Чтобы поместить измененный элемент на его место в запись необходимо:
- •3. В конце работы файл следует закрыть.
- •4. Признаком ошибки при выполнении функции dos является взведенный флаг с (переноса).
- •2. Создание файла с усечением существующего до нулевой длины.
- •LpFileName — указатель на asciiz-строку с именем (путем) открываемого или создаваемого файла;
- •DwDesiredAccess — тип доступа к файлу:
- •Лекция №6. Работа с сопроцессором. Команды для работы с fpu. Работа с fpu.
- •Лекция №6. Работа с сопроцессором. Команды для работы с fpu. Работа с fpu.
- •Лекция №6. Работа с сопроцессором. Команды для работы с fpu. Работа с fpu.
- •Лабораторная работа №1. Тема: знакомство с системой программирования Турбо-ассемблер.
- •1) Пересылка данных
- •2) Xor логическое исключающее или
- •3) Команды передачи управления
- •Лабораторная работа №2. Тема: Работа с арифметическими командами.
- •Команды сложения
- •Команды вычитания.
- •Команды умножения.
- •Команда деления
- •Команды преобразования
- •Команды сдвига
- •Лабораторная работа №4. Тема: перевод чисел из шестнадцатиричной системы исчисления в десятичную и в двоичную.
- •Директива extrn Режимы Ideal, masm
- •Преимущества и недостатки ]Преимущества
- •Недостатки
- •Блок-схема вывода на экран вещественного числа, которое хранится в регистре st(0) сопроцессора.
- •Трансцендентные операции fpu
- •Функция MessageBox
- •1) Первой известной кодировкой символов была кодировка ascii, и она используется до сих пор. В ascii-кодировке каждый символ занимает 8 бит, или один байт.
- •2.Адресные операнды – задают физическое расположение операнда в памяти с помощью указания двух составляющих адреса: сегмента и смещения. К примеру:
- •5. Структурные операнды используются для доступа к конкретному элементу структуры.
- •6. Записи (аналогично структурному типу) используются для доступа к битовому полю некоторой записи.
- •4) Нельзя использовать сегментный регистр cs в качестве операнда назначения.
- •5) Оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:
- •Xchg eax,ebx ; обменять содержимое регистров eax и ebx.
- •Xchg al,al ; а эта команда не делает ничего
- •Xchg ax, word ptr [si] ; обменять содержимое регистра ах и слова в памяти по адресу в [si].
-
Делит ax на 10;
-
Результат деления записывается так: частное – в ah, остаток в al.
Пример: умножим 2*47=94d=01011110b=ax
ax/10=> ah=0000 1001, al=0000 0100
В результате после выполнения команды aam в регистрах al и ah находятся правильные двоично-десятичные цифры произведения двух цифр.
Деление
Предварительно в регистре ах необходимо получить две неупакованные BCD –цифры делимого. Далее используется команда:
AAD – коррекция делимого для представления в символьном виде.
Команда AAD:
1) Преобразует двузначное неупакованное bcd-число в регистре ах в двоичное число;
2) Полученное двоичное число используется в качестве делимого в операции деления;
3) Полученное двоичное число помещается в регистр aх.
Делимое будет двоичным числом из диапазона 0…99.
Алгоритм, по которому работает команда aad:
-
умножается старшая цифра исходного BCD –числа в ах (содержимое ah) на 10;
-
выполняется сложение ah+al, результат которого (двоичное число) заносится в al;
-
обнуляется содержимое ah.
Далее необходимо использовать команду деления div для выполнения деления содержимого ах на одну BCD-цифру, находящуюся в байтовом регистре или байтовой ячейки памяти.
Например, разделим десятичное 25 на 5:
mov ax,0205h ; 25 в неупакованном формате
mov bl,5
aad ; теперь в АХ находится 19h
div bl ; АХ = 0005
Флаги SF, ZF и PF устанавливаются в соответствии с результатом, OF, AF и CF не определены.
Ah=0000 0010; al=0000 0101
1) 0000 0010 *0000 1010=0001 0100=ah
2) 0001 0100+0000 0101=0001 1001=al
3) ah=0000 0000 ; ax=0000 0000 0001 10012=2510
Упакованные BCD-числа
Сложение
Пример1:
67=0110 0111
+
75=0111 0101
=
142=1101 1100=22010 – неверный результат.
Правильный результат 0001 0100 0010 (14210)
Для корректировки результата существует команда:
DAA – коррекция результата сложения для представления в десятичном виде.
Команда daa преобразует содержимое регистра al в две упакованные десятичные цифры по следующему алгоритму:
1) если младшие четыре бита AL больше либо равно 9 или флаг AF = 1, то AL увеличивается на 6, CF устанавливается, если при этом сложении произошел перенос, и AF устанавливается в 1.
2) иначе AF = 0.
3) если теперь старшие четыре бита AL больше 9 или флаг CF = 1, то AL увеличивается на 60h и CF устанавливается в 1.
4) иначе CF = 0.
Флаги AF и CF устанавливаются, если в ходе коррекции происходил перенос из первой или второй цифры соответственно, SF, ZF и PF устанавливаются в соответствии с результатом, флаг OF не определен.
Например, если AL содержит число 19h, последовательность команд:
inc al
daa ; AL=20h (а не 1Ah, как было бы после INC).
1) 19h+1=1A
2) 1A16 =1 10102 +01102 =10 00002 =2016
Вычитание
Пример1: 67-75
67=0110 0111
+
-75=1011 0101 (75=1001011, 0110100+1=10110101=-75)
=
-8=0001 1100=28d – результат неверный.
Верный результат 0000 1000=810.
Контроль за знаком осуществляется с помощью флага cf, который фиксирует заём из старших разрядов.
Вычитание BCD-чисел осуществляется командами sub или sbb. Коррекция результата осуществляется командой:
DAS – коррекция результата вычитания для представления в десятичном виде.
Команда работает по следующему алгоритму:
1) если младшие четыре бита AL больше 9 или флаг AF = 1, то AL уменьшается на 6, CF устанавливается, если при этом вычитании произошел заем, и AF устанавливается в 1.
2) иначе AF = 0.
3) если теперь старшие четыре бита AL больше 9 или флаг CF = 1, то AL уменьшается на 60h и CF устанавливается в 1.
4) иначе CF = 0.
Пример: пусть AL содержит число 20h, тогда после команд:
dec al
das ; AL=19h (а не 1Fh, как было бы после DEC).
Пример5: Вывод на экран содержимого регистра АХ; 1 ASCII 31; 2 ASCII 32;... Под WIN32.
.386
.model flat, stdcall
includelib import32.lib
extrn ExitProcess:PROC
extrn MessageBoxA:PROC
.data
Ttl db 'Vivod na ekran',0h
Msg db 'Sodergimoe registra eax='
Msg1 db 6 dup(' ')
db 0h
C dw 65535 ;65535d=1111 1111 1111 1111
.code
start:
mov ax,C
mov si,10
mov edi,5
lp1:
xor dx,dx ;ax=FFFFh, si=000Ah, dx=0000h
div si ;FFFFh/000Ah=1999,0005h ;1999h/000Ah=028F,0003h; 028Fh/000Ah=0041,0005h; 0041h/000Ah=0006,0005h; 0006h/000Ah=0000,0006h
; AX,DX AX,DX AX,DX AX,DX AX,DX
xchg ax,dx ;Ax=0005h:Dx=1999h; Ax=0003h:Dx=028Fh Ax=0005h:Dx=0041h Ax=0005h:Dx=0006h Ax=0006h:Dx=0000h
add al,'0' ;AX=0035h Ah=00h Al=35h; Ax=0033h Ah=00h Al=33h Ax=0035h Ah=00h Al=35h Ax=0035h Ah=00h Al=35h Ax=0036h Ah=00h Al=36h
mov byte ptr [Msg1+edi],al
xchg ax,dx ;Ax=1999h:Dx=0035h; Ax=028Fh:Dx=0033h; Ax=0041h:Dx=0035h; Ax=0006h:Dx=0035h; Ax=0000h:Dx=0036h;
dec edi ; edi=4 edi=3 edi=2 edi=1 edi=0
or ax,ax ;1999 or 1999 = 1111h 028Fh or 028Fh=0111h 0041h or 0041h=0011h 0006h or 0006h=0001h 0000h or 0000h=0000h
; устанавливает флаг ZF в 1 если в АХ не 0
jne lp1
push 0h
push offset Ttl
push offset Msg
push 0h
call MessageBoxA
push 0h
call ExitProcess
end start
Таблица ASCII кодов.
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
0 |
... |
... |
|
0 |
@ |
P |
' |
Р |
А |
Р |
а |
... |
... |
... |
р |
Ё |
1 |
... |
... |
! |
1 |
A |
Q |
a |
Q |
Б |
С |
б |
... |
... |
... |
с |
ё |
2 |
... |
... |
" |
2 |
B |
R |
b |
R |
В |
Т |
в |
... |
... |
... |
т |
Є |
3 |
... |
... |
# |
3 |
C |
S |
c |
S |
Г |
У |
г |
... |
... |
... |
у |
є |
4 |
... |
... |
$ |
4 |
D |
T |
d |
T |
Д |
Ф |
д |
... |
... |
... |
ф |
Ї |
5 |
... |
... |
% |
5 |
E |
U |
e |
U |
Е |
Х |
е |
... |
... |
... |
х |
ї |
6 |
... |
... |
& |
6 |
F |
V |
f |
V |
Ж |
Ц |
ж |
... |
... |
... |
ц |
Ў |
7 |
... |
... |
' |
7 |
G |
W |
g |
W |
З |
Ч |
з |
... |
... |
... |
ч |
ў |
8 |
... |
... |
( |
8 |
H |
X |
h |
X |
И |
Ш |
и |
... |
... |
... |
ш |
° |
9 |
... |
... |
) |
9 |
I |
Y |
i |
Y |
Й |
Щ |
й |
... |
... |
... |
щ |
∙ |
A |
... |
... |
* |
: |
J |
Z |
j |
Z |
К |
Ъ |
к |
... |
... |
... |
ъ |
· |
B |
... |
... |
+ |
; |
K |
[ |
k |
{ |
Л |
Ы |
л |
... |
... |
... |
ы |
√ |
C |
... |
... |
, |
< |
L |
\ |
l |
| |
М |
Ь |
м |
... |
... |
... |
ь |
№ |
D |
... |
... |
- |
= |
M |
] |
m |
} |
Н |
Э |
н |
... |
... |
... |
э |
¤ |
E |
... |
... |
. |
> |
N |
^ |
n |
~ |
О |
Ю |
о |
... |
... |
... |
ю |
■ |
F |
... |
... |
/ |
? |
O |
_ |
o |
¤ |
П |
Я |
п |
... |
... |
... |
я |
|
Блок-схема алгоритма вывода на экран содержимого регистра ах в любой системе исчисления:
1) Инициализация регистра данными: mov ax,C. Необходимо вывести на экран значение «С». С имеет размерность в 2 байта максимум.
2) Инициализация регистра si:
mov si,10 ;10-основание системы исчисления, в которую необходимо перевести значение С.
3) Инициализация регистра edi:
mov edi,5 ; 5 – количество позиций, которое отводится для десятичного числа (под ответ).
Обнуление регистра dx, в который будет записываться остаток от деления: xor dx,dx
1) Деление: С/10; dx-остаток, ax-целая часть.
2) Перевод остатка в ASCII символ: dx+30.
3) Запись символа ASCII в переменную Msg в позицию под номером edi.
С:=ах;
Edi:=edi-1;
Ax<>0
Нет
Да
Вывод значение переменной Msg с помощью функции MessageBoxA.
Решение задач.
Пример 2: 6*С+(В-С+1)/2
.386
.model flat, stdcall
extrn ExitProcess:PROC
.data
B DW 8
C DW 3
D Db 2
.code
start:
mov AX,6
mov BX,C
mul BX
mov Dx,AX
mov Ax,B
mov Bx,C
sub Ax,Bx
jl m1 ; отрицательный ли результат? Если да, то переход на метку m1. Если
;результат положительный, то продолжаем выполнять следующую команду.
add ax,1
xor bx,bx
mov bl,D
div bl
add ax,dx
jmp m2
m1: ; результат (B-C) оказывается отрицательным!
neg ax
mov bx,1
sub ax,bx
xor bx,bx
mov bl,D
div bl
neg ax
add Ax,Dx
m2:
push 0h
call ExitProcess
end start
Пример 1: 6*С+(В-С+1)/2
model small
.stack 100h
.data
B DW 8 ; резервирование памяти для данных размером 2 байт;
C DW 3 ; резервирование памяти для данных размером 2 байт;
D Db 2 ; резервирование памяти для данных размером 1 байт;
.code
start:
mov AX,@data
mov DS,AX
mov AX,6
mov BX,C
mul BX
mov Dx,AX
mov Ax,B
mov Bx,C
sub Ax,Bx
jl m1 ; отрицательный ли результат? Если да, то переход на метку m1. Если
;результат положительный, то продолжаем выполнять следующую команду.
add ax,1
xor bx,bx
mov bl,d
div bl
add ax,dx
jmp m2
m1: ; результат оказывается отрицательным!
neg ax
mov bx,1
sub ax,bx
xor bx,bx
mov bl,d
div bl
neg ax
add Ax,Dx
m2:
mov AX,4C00h
int 21h
end start