
- •Лекция №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].
4) Нельзя использовать сегментный регистр cs в качестве операнда назначения.
5) Оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:
.data
flp dw ?
.code
start:
----
mov byte ptr (flp+1),0ffh
----
end start
Для двунаправленной пересылки данных применяют команду xchg. Эту же операцию можно выполнить применив последовательность из нескольких команд mov. Общий вид записи:
XCHG <операнд1>, <операнд2>
Содержимое операнда2 копируется в операнд1, а старое содержимое операнда1 — в операнд2. XCHG можно выполнять над двумя регистрами или над регистром и переменной.
Например:
Xchg eax,ebx ; обменять содержимое регистров eax и ebx.
То же, что три команды на языке С:
temp = eax;
eax = ebx;
ebx = temp;
Xchg al,al ; а эта команда не делает ничего
Xchg ax, word ptr [si] ; обменять содержимое регистра ах и слова в памяти по адресу в [si].
22. Відмінності програми, написаної для DOS16 та для Win32. Арифметичні команди. Випадки при яких виникає переповнення результату ділення. Способи, що позволяють виконати ділення навіть при виникненні переповнення результату ділення.
Программирование арифметических выражений в языке Ассемблер происходит через некоторые команды такие, как: mul, div, sub, add. Эти команды называются командами арифметических операций.
Mul – команда умножения. Она умножает регистр ax на то, что стоит после нее. Результат заносится в ax. Div – команда деления. Она делит регистр axна то, что стоит после нее. Результат заносится в ax. Add – команда сложения. Слаживает два числа. Результат заносится в первый регистр. Sub – команда вычитания. Вычитает два числа. Результат заносится в первый регистр.
Пример: Написать программу на ассемблере вычисления выражения: а – e/b – de; где а =5; b =27; c = 86; е =1986; d =1112; Результат вычисления выражения сохранить в памяти. Навести значение и порядок размещения данные в памяти.
Текст программы
.686 ; директива определения типа микропроцессора .model flat,stdcall ; задание линейной модели памяти ; но соглашения ОС Windows
.data ; директива определения данные _a dw 5 ; запись в 16-разрядный амбарчик памяти с именем _а числа 5 _b dw 27 ; запись _b = 16h _c dw 86 ; запись _c = 56h _e dw 1986 ; запись _e = 7C2h _d dw 1112 ; запись _d = 458 res dw 0 ; резервирование памяти для сохранения переменной res
.code ; директива начала сегмента команд start: mov edx,0 ; очистка регистров mov ebx,0 ; очистка регистров mov ecx,0 ; очистка регистров mov ах,_e ; в регистр ах заносим число _e = 7C2h mul _d ; множим _e и _d SHL edx,16 ; делаем здвиг на 16 mov dx,ax push edx ; бросаем значение в стек mov edx,0 mov ах,_e mov cx,_b div cx ; делим ах с cx pop ecx ; достаем из стеку значения sub ecx,eax ; отнимаем mov ах,_a sub eax,ecx mov res, eax ret ; возвращение управление ОС end start ; окончание программы с именем _start
Переполнение результата деления возникает в следующих случаях:
1. Делитель равен 0
2. При делении байтов без знака делимое без знака делимое пол меньшей мере в 256 раз превышает делитель.
3. При делении слов без знака делимое по меньшей мере в 65 536 раз превышает делитель.
4. При делении байтов со знаком частное лежит вне диапазона от –128 до 127 .
5. При делении слов со знаком частное лежит вне диапазона от –32768 до 32767
Коррекция результата
Для того чтобы поучить правильный результат (т.е. выполнить перенос из одного разряда в другой, 56+25= 81, один десяток надо перенести в старший разряд) необходимо его скорректировать. Это делается с помощью следующих команд.
AAA – скорректировать результат сложения для представления в кодах ASCII.
DAA – скорректировать сложение для представления в десятичном формате.
Формат:
AAA
DAA
24. Команда cmp у асемблері. Робота з негативними числами в асемблері при виконанні арифметичних операцій. Значення прапора sf. Приклади встановлення прапора sf при виконанні віднімання В-С. Алгоритм виведення негативних чисел на екран.
Команда cmp выполняет вычитание операторов и устанавливает флаги, не записывает результат вычитания на место первого операнда.
Cmp операнд_1, операнд_2
|
Опкод |
Значение(переход,если...) |
Условие |
|||
|
JA |
Jump if above (X > Y) |
CF=0 & ZF=0 |
|||
|
JAE |
Jump if above or equal (X >= Y) |
CF=0 |
|||
|
JB |
Jump if below (X < Y) |
CF=1 |
|||
|
JBE |
Jump if below or equal (X < Y) |
CF=1 or ZF=1 |
|||
|
JC |
Jump if carry (cf=1) |
CF=1 |
|||
|
JCXZ |
Jump if CX=0 |
регистр CX=0 |
|||
|
JE (то же, что и JZ) |
Jump if equal (X = Y) |
ZF=1 |
|||
|
JG |
Jump if greater (signed) (X > Y) |
ZF=0 & SF=OF |
|||
|
JGE |
Jump if greater or equal (signed) (X >= Y) |
SF=OF |
|||
|
JL |
Jump if less (signed) (X < Y) |
SF != OF |
|||
|
JLE |
Jump if less or equal (signed) (X <= Y) |
ZF=1 or SF!=OF |
|||
|
JMP |
Безусловный переход |
- |
|||
|
JNA |
Jump if not above (X <= Y) |
CF=1 or ZF=1 |
|||
|
JNAE |
Jump if not above or equal (X < Y) |
CF=1 |
|||
|
JNB |
Jump if not below (X >= Y) |
CF=0 |
|||
|
JNBE |
Jump if not below or equal (X > Y) |
CF=1 & ZF=0 |
|||
|
JNC |
Jump if not carry (cf=0) |
CF=0 |
|||
|
JNE |
Jump if not equal (X != Y) |
ZF=0 |
|||
|
JNG |
Jump if not greater (signed) (X <= Y) |
ZF=1 or SF!=OF |
|||
|
JNGE |
Jump if not greater or equal (signed) (X < Y) |
SF!=OF |
|||
|
JNL |
Jump if not less (signed) (X >= Y) |
SF=OF |
|||
|
JNLE |
Jump if not less or equal (signed) (X > Y) |
ZF=0 & SF=OF |
|||
|
JNO |
Jump if not overflow (signed) (of=0) |
OF=0 |
|||
|
JNP |
Jump if no parity (pf=0) |
PF=0 |
|||
|
JNS |
Jump if not signed (signed) (sf=0) |
SF=0 |
|||
|
JNZ |
Jump if not zero (X != Y) |
ZF=0 |
|||
|
JO |
Jump if overflow (signed) (of=1) |
OF=1 |
|||
|
JP |
Jump if parity (pf=1) |
PF=1 |
|||
|
JP |
Jump if parity (pf=1) |
PF=1 |
|||
|
JPE |
Jump if parity even |
PF=1 |
|||
|
JPO |
Jump if parity odd |
PF=0 |
|||
|
JS |
Jump if signed (signed) |
SF=1 |
|||
|
JZ |
Jump if zero (X = Y) |
ZF=1 |
|||
sf |
Флаг знака (Sign Flag) |
7 |
1, если старший бит результата равен 1; 0, если старший бит результата равен 0 |
; Программа формирует массив структур. Массив вводится вручную.
; На экран выводится возраст всех сотрудников
masm
model small
.stack 100h
worker struc ;информация о сотруднике
nam db 15 dup (' ') ;имя
lastnam db 15 dup (' ') ; фамилия
age db 2 dup (' ') ;возраст
worker ends
.data
buf1 db 15 dup (20h)
pole dw ?
pole1 db 2 dup (?) ; поле для вывода возраста
db 0ah,0dh,'$'
count db ?
N=3 ; размерность массива
mas_sotr worker N dup (<>)
mes1 db 'Vvedite 3 elementa strukturi: ','$'
mnam db 10,13,'Vvedite imya: ', '$'
mlastnam db 10,13,'Vvedite familiyou: ','$'
mage db 10,13,'Vvedite vozrast: ','$'
mes db 10,13,'Vozrast=',10,13,'$'
.code
assume ds:@data,es:@data
start:
mov ax,@data
mov ds,ax
xor ax,ax
push ds
pop es
Vvod:
mov dx,offset mes1
mov ah,09h ;Функция Dos вывода сообщения на
int 21h
mov cx,N
mov si,0
mov bx, offset mas_sotr
mov ax, type worker
mov dl,0
mul dl
add ax,bx
cld
; Цикл cykl2 – цикл формирования массива структур в памяти.
cykl2:
push cx
mov di,ax
mov pole,ax
mov dx,offset mnam
mov ah,09h ;Функция Dos вывода сообщения на
int 21h
lea dx,buf1
mov ah,0ah
int 21h
push si
lea si,buf1
add si,1
mov cl,byte ptr [si]
add si,1
rep movsb
pop si
mov dx,offset mlastnam
mov ah,09h ;Функция Dos вывода сообщения на
int 21h
lea dx,buf1
mov ah,0ah
int 21h
push si
lea si,buf1
add si,1
mov cl,byte ptr [si]
mov di,pole
add di,15
add si,1
rep movsb
pop si
mov dx,offset mage
mov ah,09h ;Функция Dos вывода сообщения на
int 21h
lea dx,buf1
mov ah,0ah
int 21h
push si
lea si,buf1
add si,1
mov cl,byte ptr [si]
mov di,pole
add di,30
add si,1
rep movsb
pop si
jmp label_1
m1:
loop cykl2
; ----------------------------------------Метка label_1: продолжение цикла cykl2, так как он получается
; очень большим, то часть цикла вынесли за его пределы.
label_1:
pop cx
cmp cx,1
je vivod
inc si
mov ax, type worker
mov dx,si
mul dl
add ax,bx
jmp m1
; -------------------------------------------В конец массива структур записываем конец вывода '$'.
Vivod:
mov byte ptr [di],'$'
mov dx,offset mes
mov ah,9h
int 21h
; ------------------------------------------В поле pole1 записывается возраст каждого сотрудника из
; массива структур в памяти. Далее содержимое поля pole1 выводится на экран.
lea si,mas_sotr
mov bx, type worker
mov ax,0
mov count,al
lea di,pole1
mov cx,3
cykl_vivod:
lea dx,[si].age ;lea dx,[si+1E]
mov si,dx
movsw
mov dx,offset pole1
mov ah,09h
int 21h
lea di,pole1
loop cykl_vivod
mov AX,4C00h
int 21h
end start
Самостоятельно на практике:
1) Переделать программу под WIN32.
2) Создать массив структур mas_sotr2 worker 7 dup (<>). Инициализировать массив структур в программе. На экран выдать сообщение в окне MessageBoxA. Сообщение должно содержать все данные структуры для самого старшего сотрудника.
П