Архитектура ЭВМ и язык ассемблера Учебный курс заместитель министра связи и массовых

advertisement
Учебный курс
Архитектура ЭВМ
и язык ассемблера
Лекция 4
заместитель министра связи и массовых
коммуникаций РФ, старший преподаватель
Северов Дмитрий Станиславович
Активационные записи: стековые фреймы
• Состав
– Параметры
– Точка возврата
– Сохранённые регистры
– Локальные переменные
• Типичные действия
– аргументы – в стек
– вызвать процедуру
– EBP – в стек
– ESP – в EBP
– локальные – в стек
– <целевые действия>
– вернуться/восстановить
• CS:EIP
• SS:ESP
• Остальной контекст
• Модели памяти
– TINY
– SMALL
– MEDIUM
– COMPACT
– LARGE
– HUGE
– FLAT
• Описатель ЯВУ
– BASIC
–C
– FORTRAN
– PASCAL
– STDCALL
– SYSCALL
• Тип стека
2
Модели памяти IA-16
TINY
SMALL
Данные и код вместе < 64KIB
Сегменты (CS, DS, SS и ES) - совмещены
Исключительно относительные адреса.
Код (CS) отдельно от данных (DS, SS и ES)
Исключительно относительные адреса
COMPACT
Код < 64KIB, данные < 1MIB
Допустимы абсолютные адреса для данных,
Только относительные адреса для кода.
MEDIUM
Данные < 64KIB, Код < 1MIB
Допустимы абсолютные адреса для кода,
Только относительные адреса для данных.
LARGE
Данные и код < 1MIB
Допустимы абсолютные адреса для кода и данных
Статическое данное < 64KIB (ограничено)
HUGE
Данных и кода < 1MIB
Допустимы абсолютные адреса для кода и данных
Статическое данное < 1MIB
3
Описатели ЯВУ
SDTCALL
C
PASCAL
Размещение в
стеке
Обратное
Обратное
Прямое
Возвращает
стек обратно
Вызываемый
ret ??
SDTCALL
Вызывающий Вызываемый
add esp,??
ret ??
C
PASCAL
4
Рекурсия
TITLE Calculating a Factorial Factorial PROC
push ebp
INCLUDE Irvine32.inc
mov ebp,esp
mov eax,[ebp+8]; get n
.code
cmp eax,0 ; n < 0?
main PROC
ja
L1
; yes: continue
push 12
; вычислим 12!
mov eax,1 ; no: return 1
call Factorial
jmp L2
ReturnMain:
call WriteDec ; display it L1: dec eax
call Crlf
push eax
; Factorial(n-1)
call Factorial
exit
main ENDP
ReturnFact:
mov ebx,[ebp+8]; взять n
mul ebx
; еax=еax*еbx
L2: pop ebp
; очистить стек
ret 4
Factorial ENDP
END main
5
Некоторые отличия режимов
• Размер сегментов
• Совмещение сегментов
• Доступность сегментных регистров
• Ограничения базово-индексной адресации
– RM: [bx+si],[bx+di],[bp+si],[bp+di]
• Счётчик по умолчанию
• Вычисление линейного адреса
6
Вычисление адресов в режиме PM
• Дескриптор
сегмента
Логический адрес
Селектор(16) Смещение(32)
Линейныйадрес(32)
Каталог(10)
Таблица(10)
Смещение(12)
+
Таблица
дескрипторов
Дескриптор
сегмента
Таблица страниц
Страничный
каталог
Эл-т таблицы(32)
Эл-т каталога(32)
GTDR/LDTR(32)
CR3(32)
+
Физический адрес(32)
– Начало
– Уровень
привилегий
– Тип, способ
доступа
– Присутствие
– Гранула
– Длина
• GDT – общие сегменты
• LDT – сегменты, специфические для задачи
7
Массивы и строки
• Присвоить массив
– Установить начала источника и получателя
в регистрах DS:ESI, ES:EDI
– Установить направление изменения адресов командами
CLD, STD
– Установить количество пересылок
в регистре ECX
– Многократно выполнить пересылку командой с
префиксом: rep movsb rep movsw, rep movsd
• Префиксы для строк: repz/repe repnz/repne
• Сравнить cmps? сканировать scas?
сохранить stos? загрузить lods?
8
Двумерные массивы
TITLE Two-Dimensional Table
(Table2.asm)
INCLUDE Irvine32.inc
.data
tableB BYTE 10h, 20h, 30h, 40h, 50h
BYTE 60h, 70h, 80h, 90h, 0A0h
BYTE 0B0h, 0C0h, 0D0h, 0E0h, 0F0h
RowSiZe = 5
.code
main PROC
mov ebx,(1*RowSiZe)
; 1-индекс строки
mov esi, 2
; 2-индекс столбца
mov al,tableB[ebx + esi] ; AL = 80h
exit
main ENDP
END main
9
Структуры
• Определение типа
COORD STRUCT
X
WORD
?
Y
WORD
?
COORD ENDS
RECTANGLE STRUCT
UpperLeft COORD <>
LowerRight
COORD <>
RECTANGLE ENDS
• Определение переменной
.data
point1 COORD
AllPoints COORD
<>
3 DUP <0,0>
• Обращение
.code
mov point1.X, 1
mov (COORD PTR AllPoints[edi]).X,ax
add edi, TYPE COORD
mov (Rectangle PTR [esi]).UpperLeft.Y, 10
10
Объединения
• Определение типа
Integer Union
D
DWORD
W
WORD
B
BYTE
Integer ENDS
RECTANGLE STRUCT
UpperLeft COORD
LowerRight
RECTANGLE ENDS
0
0
0
<>
COORD <>
• Определение переменной
.data
val3 Integer <12345678h>
• Обращение
.code
mov val3.B, al
mov val3.W, ax
mov val3.D, eax
11
Макрокоманды
• Определение
• С данными
mPutchar MACRO char:REQ
push eax
mov al,char
call WriteChar
pop eax
ENDM
mWrite MACRO text
LOCAL string
.data
string BYTE text,0
push edx
mov edx,OFFSET string
call WriteString
pop edx
ENDM
• Вызов
mov al,’A’
mov ecx,20
L1:
mPutchar al
inc al
loop L1
• Вложенные
mWriteLn MACRO text
mWrite text
call CrLf
ENDM
12
Условное ассемблирование
• Если
IF выражение
IFB <аргумент>
IFIDN <арг.>,<значение>
IFDEF имя
…а также IFNB IFIDNI
IFDIF IFDIFI IFNDEF
• То
ELSE
• Завершить
ENDIF
EXITM
• Проверка аргументов
• Значения по умолчанию
аргумент := <значение>
• Операторы в выражении
LT GT EQ NE LE GE
• Подстановка значения
&
• Вычисление выражения
%
• Обозначение текста
<почти любой текст>
• Обозначение символа
!
13
Макрофункции
• Определение
IsDefined MACRO symbol
IFDEF symbol
EXITM <-1> ;; Истина
ELSE
EXITM <0> ;; Ложь
ENDM
• Вызов
…
RealMode=1
…
IF IsDefined( RealMode )
mov ax,@data
mov ds,ax
ENDIF
14
Блоки повторения
• По условию
.data
val1 = 1
val2 = 1
DWORD val1
DWORD val2
val3 = val1 +
WHILE val3 LT
DWORD val3
val1 = val2
val2 = val3
val3 = val1
ENDM
• По количеству
.data
ival = 10
REPEAT 100
DWORD ival
ival = ival
ENDM
val2
0F0000000h
+ val2
• Для каждого в списке
.data
…
SEMESTER STRUC
Courses COURSE 6 DUP(<>)
NumCourses WORD ?
SEMESTER ENDS
FOR semName,<F07,S08,F08,S09>
semName SEMESTER <>
ENDM
• Для каждго символа
.data
Delimiters LABEL BYTE
FORC code, <@#$%^&*!<!>>
BYTE ”&code”
ENDM
+ 10
15
Пробелы в «пунктире» лекций
• Создание 16-ти разрядных программ DOS
• Программирование с функциями BIOS
• Использование средств программирования
• Примеры и задачи
16
Терминал Windows
• Специальное связывание
– LINK … /SUBSYSTEM:CONSOLE
• Две модели – две группы функций ввода-вывода
– Простейшая, канальная, потоковая
• Очереди символов
– Низкоуровневая
• Входной буфер – очередь записей о событиях ввода
• Буфер экрана – двумерный массив данных и атрибутов
отображаемого текста
• Две кодировки
– ASCII/ANSI <имя_функции>A
– Unicode <имя_функции>W
• Два набора наименований типов данных
• Разрушаются: EAX, EBX, ECX, EDX
17
Терминал Windows (продолжение)
• Дескрипторы терминала из SmallWin.inc
– Стандартного канала ввода: STD_INPUT_HANDLE
– Стандартного канала ввода: STD_OUTPUT_HANDLE
– Стандартного канала диагностики: STD_ERROR_HANDLE
.data
inputHandle
DWORD ?
.code
INVOKE GetStdHandle, STD_INPUT_HANDLE
mov inputHandle,eax
• Необходимые дополнительные действия
– Получить дескриптор
– Сохранить, установить, восстановить режим
18
Терминальные функции
• Согласование типов ОС и ассемблера
• 43 (сорок три) функции по Ирвайну: операции с …
–
–
–
–
–
–
–
–
–
–
окнами
терминалами
дескрипторами
буферами
записями
режимами
символами
атрибутами
кодировками
курсорами
19
Вывод на консоль
TITLE
Пример консольного приложения Win32 #1 (Console1.asm)
INCLUDE Irvine32.inc
.data
endl
EQU
<0dh,0ah>
; Признак конца строки
message \
BYTE "------------- Console1.asm -----------------------",endl
BYTE "Это пример вывода на консоль.",endl
BYTE "WriteConsole системы Win32.",endl
BYTE "-------------------------------------------------",endl
messageSize = ($-message)
consoleHandle
DWORD
0
bytesWritten
DWORD
?
.code
main PROC
INVOKE GetStdHandle, STD_OUTPUT_HANDLE
mov
consoleHandle,eax
INVOKE WriteConsole,
consoleHandle,
; DWORD - Дескриптор устройства вывода
ADDR message,
; PTR BYTE - Адрес строки
messageSiZe,
; DWORD - Длина строки
ADDR bytesWritten, ; PTR WORD - Адрес кол-ва выведенных
0
; DWORD - Зарезервировано
INVOKE ExitProcess,0
main ENDP
END main
20
Чтение с консоли
TITLE
Программа чтения с консоли
INCLUDE Irvine32.inc
BufSiZe = 80
.data
buffer
BYTE BufSiZe DUP(?),0,0
stdInHandle DWORD ?
bytesRead
DWORD ?
.code
main PROC
INVOKE GetStdHandle, STD_INPUT_HANDLE
mov
stdInHandle,eax
INVOKE ReadConsole, ;
stdInHandle, ;DWORD
- дескриптор устройства ввода
ADDR buffer, ;PTR BYTE – адрес массива для ввода
BufSiZe - 2, ;DWORD – максимальное кол-во вводимых
ADDR bytesRead,; PTR DWORD – адрес кол-ва введённых
0
; DWORD - зарезервировано
mov
esi,OFFSET buffer
mov
ecx,16
mov
ebx,TYPE buffer
call DumpMem
exit
main ENDP
END main
21
Файловый ввод-вывод
• CreateFile
– Открытие/создание файлов
• CloseHandle
– Закрытие файлов
• ReadFile
– Чтение файлов
• WriteFile
– Запись файлов
• SetFilePointer
– Перемещение файлового указателя
22
Функции времени и даты
• 20 (двадцать) : операции с …
– локальным и мировым временем
– различными форматами
• системным
• DOS
• штампом файла
SYSEMTIME STRUCT
wYear
WORD
wMonth
WORD
wDayOfWeek WORD
wDay
WORD
wHour
WORD
wMinute
WORD
wSecond
WORD
wMillisec WORD
SYSEMTIME ENDS
?
?
?
?
?
?
?
?
;
;
;
;
;
;
;
;
4 цифры
1-12
0-6
1-31
0-23
0-59
0-59
0-999
23
Часть оконных примитивов
• Структуры сложных данных
– Точка
– Область экрана
– Системное сообщение
– Класс окна
• Необходимые процедуры
– MessageBox : Вывод текста в граф.режиме
– WinMain : Инициализация граф.приложения
– WinProc : Обработка системных событий
– ErrorHandler : Обработка ошибок (необяз.)
24
Оконный сценарий
.386
WinProc PROC,
.model flat,STDCALL
; Эта процедура обрабатывает некоторые
INCLUDE GraphWin.inc
сообщения, посылаемые системой Windows
нашему приложению.
.data
; Определим структурную переменную,
; Щелчок левой кнопкой мыши?
описывающую класс окна
; Окно создано?
.code
; Окно закрыто?
WinMain PROC
сообщений выполняется
; Определим дескриптор текущего процесса ; Обработка
стандартной процедурой системы WIndows.
; Загрузим образы пиктограммы и курсора WinProc ENDP
программы.
;--------------------------------------------------; Зарегистрируем класс окна
ErrorHandler PROC
; Создадим основное окно программы
; Получим код ошибки
; - если ошибка, отобразим сообщение и
остановимся
; Определим адрес текстового сообщения об
; Отобразим окно на экране и обновим его
ошибке
содержимое
; Отобразим сообщение об ошибке
; Выведем приветственное сообщение
; Освободим память, c cообщением об
; Создадим цикл обработки сообщений
ошибке
; Получим новое сообщение из очереди
ErrorHandler ENDP
; Если в очереди больше нет сообщений,
END WinMain
остановимся
; Отправим сообщение на обработку процедуре
WInProc нашей программы
WinMain ENDP
25
Памятка интерфейса с ЯВУ
• Соглашения о присвоении имён
– Компилятором ЯВУ
– Компилятором ассемблера
• Модель памяти
• Соглашение о вызове процедур
– Сохраняемые регистры
– Передача аргументов
• Метод: регистры, стек, память, иное
• Порядок: сначала первый или последний
• Способ: значение, ссылка, иное
– Восстановление стека
– Возврат результата
• Имена внешних идентификаторов, сегментов
• Соглашение о конструкции сложных данных
• http://cs.mipt.ru/korotin/korotin_lecture12.ppt
26
Ассемблерные вставки Visual C++
• Можно
–
–
–
–
–
–
Обращаться к регистрам
Обращаться к меткам и переменным С++
Обращаться к параметру функции по имени
Смешивать синтаксис литералов
Использовать операторы PTR,LENGTH,SIZE,TYPE
Загружать адрес командой LEA
• Нельзя
– определять данные директивами
– использовать операторы кроме разрешённых выше
• определять адрес директивой OFFSET
– использовать макроопределения
– обращаться к сегментам по имени
27
Download