270 likes | 467 Views
Учебный курс. Архитектура ЭВМ и язык ассемблера Лекция 4 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович. Активационные записи: стековые фреймы. • Состав – Параметры – Точка возврата – Сохранённые регистры
E N D
Учебный курс Архитектура ЭВМ и язык ассемблера Лекция 4 заместитель министра связи и массовых коммуникаций РФ,старший преподаватель Северов Дмитрий Станиславович
Активационные записи: стековые фреймы • Состав – Параметры – Точка возврата – Сохранённые регистры – Локальные переменные • Типичные действия – аргументы – в стек – вызвать процедуру – EBP – в стек – ESP – в EBP – локальные – в стек – <целевыедействия> – вернуться/восстановить • CS:EIP • SS:ESP • Остальной контекст • Модели памяти – TINY – SMALL – MEDIUM – COMPACT – LARGE – HUGE – FLAT • Описатель ЯВУ – BASIC – C – FORTRAN – PASCAL – STDCALL – SYSCALL • Тип стека
Модели памяти IA-16 Данные и код вместе < 64KIB Сегменты (CS, DS, SS и ES) - совмещены Исключительно относительные адреса. Код (CS) отдельно от данных (DS, SS и ES) Исключительно относительные адреса Код < 64KIB, данные < 1MIB Допустимы абсолютные адреса для данных, Только относительные адреса для кода. Данные < 64KIB, Код < 1MIB Допустимы абсолютные адреса для кода, Только относительные адреса для данных. Данные и код < 1MIB Допустимы абсолютные адреса для кода и данных Статическое данное < 64KIB (ограничено) Данных и кода < 1MIB Допустимы абсолютные адреса для кода и данных Статическое данное < 1MIB TINY SMALL COMPACT MEDIUM LARGE HUGE
Описатели ЯВУ SDTCALL C PASCAL Размещение в стеке Обратное Обратное Прямое Возвращает стек обратно Вызываемый ret?? SDTCALL Вызывающий Вызываемый add esp,?? ret ?? PASCAL C
Рекурсия TITLE Calculating a Factorial INCLUDE Irvine32.inc .code main PROC push 12 ; вычислим 12! call Factorial ReturnMain: call WriteDec ; display it call Crlf exit main ENDP Factorial PROC push ebp mov ebp,esp mov eax,[ebp+8]; get n cmp eax,0 ; n < 0? ja L1 ; yes: continue mov eax,1 ; no: return 1 jmp L2 L1: dec eax push eax ; Factorial(n-1) call Factorial ReturnFact: mov ebx,[ebp+8]; взять n mul ebx L2: pop ebp ret 4 Factorial ENDP END main ; еax=еax*еbx ; очистить стек
Некоторые отличия режимов • Размер сегментов • Совмещение сегментов • Доступность сегментных регистров • Ограничения базово-индексной адресации – RM: [bx+si],[bx+di],[bp+si],[bp+di] • Счётчик по умолчанию • Вычисление линейного адреса
Вычисление адресов в режиме PM • Дескриптор сегмента – Начало Логический адрес Селектор(16) Смещение(32) Линейныйадрес(32) – Уровень привилегий Каталог(10) Таблица(10) Смещение(12) + Таблица дескрипторов Дескриптор сегмента GTDR/LDTR(32) Таблица страниц Эл-т таблицы(32) Физический адрес(32) – Тип, способ доступа – Присутствие – Гранула – Длина Страничный каталог Эл-т каталога(32) CR3(32) + • GDT – общие сегменты • LDT – сегменты, специфические для задачи
Массивы и строки • Присвоить массив – Установить начала источника и получателя в регистрах DS:ESI, ES:EDI – Установить направление изменения адресов командами CLD, STD – Установить количество пересылок в регистре ECX – Многократно выполнить пересылку командой с префиксом: repmovsbrepmovsw, repmovsd • Префиксы для строк: repz/reperepnz/repne • Сравнить cmps? сканировать scas? сохранить stos? загрузить lods?
Двумерные массивы TITLE Two-Dimensional Table INCLUDE Irvine32.inc (Table2.asm) .data tableB BYTE BYTE 10h, 20h, 30h, 40h, 50h 60h, 70h, 80h, 90h, 0A0h BYTE RowSiZe = 5 .code main PROC 0B0h, 0C0h, 0D0h, 0E0h, 0F0h mov ebx,(1*RowSiZe) ; 1-индекс строки mov mov esi, 2 al,tableB[ebx + esi] ; 2-индекс столбца ; AL = 80h exit main ENDP END main
Структуры • Определение типа 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
Объединения • Определение типа 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
Макрокоманды • Определение mPutchar MACRO char:REQ push eax mov al,char call WriteChar pop eax ENDM • Вызов mov al,’A’ mov ecx,20 L1: mPutchar al inc al loop L1 • С данными mWrite MACRO text LOCAL string .data string BYTE text,0 push edx mov edx,OFFSET string call WriteString pop edx ENDM • Вложенные mWriteLn MACRO text mWrite text call CrLf ENDM
Условное ассемблирование • Если IF выражение IFB <аргумент> IFIDN <арг.>,<значение> IFDEF имя …а также IFNB IFIDNI IFDIF IFDIFI IFNDEF • То ELSE • Завершить ENDIF EXITM • Проверка аргументов • Значения по умолчанию аргумент := <значение> • Операторы в выражении LT GT EQ NE LE GE • Подстановка значения & • Вычисление выражения % • Обозначение текста <почти любой текст> • Обозначение символа !
Макрофункции • Определение IsDefined MACRO symbol IFDEFsymbol EXITM <-1> ;; Истина ELSE EXITM <0> ;; Ложь ENDM • Вызов … RealMode=1 … IF IsDefined( RealMode ) mov ax,@data mov ds,ax ENDIF
Блоки повторения • По условию .data val1 = 1 val2 = 1 DWORD val1 DWORD val2 val3 = val1 + val2 WHILE val3 LT 0F0000000h DWORD val3 val1 = val2 val2 = val3 val3 = val1 + val2 ENDM • По количеству .data ival = 10 REPEAT 100 DWORD ival ival = ival + 10 ENDM • Для каждого в списке .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
Пробелы в «пунктире» лекций • Создание 16-ти разрядных программ DOS • Программирование с функциями BIOS • Использование средств программирования • Примеры и задачи
Терминал Windows • Специальное связывание – LINK … /SUBSYSTEM:CONSOLE • Две модели – две группы функций ввода-вывода – Простейшая, канальная, потоковая • Очереди символов – Низкоуровневая • Входной буфер – очередь записей о событиях ввода • Буфер экрана – двумерный массив данных и атрибутов отображаемого текста • Две кодировки – ASCII/ANSI <имя_функции>A – Unicode <имя_функции>W • Два набора наименований типов данных • Разрушаются: EAX, EBX, ECX, EDX
Терминал Windows (продолжение) • Дескрипторы терминала из SmallWin.inc – Стандартного канала ввода: STD_INPUT_HANDLE – Стандартного канала ввода: STD_OUTPUT_HANDLE – Стандартного канала диагностики: STD_ERROR_HANDLE .data inputHandle DWORD ? .code INVOKE GetStdHandle, STD_INPUT_HANDLE movinputHandle,eax • Необходимые дополнительные действия – Получить дескриптор – Сохранить, установить, восстановить режим
Терминальные функции • Согласование типов ОС и ассемблера • 43 (сорок три) функции по Ирвайну: операции с … – – – – окнами терминалами дескрипторами буферами записями режимами символами атрибутами кодировками курсорами – – – – – –
Вывод на консоль 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
Чтение с консоли 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
Файловый ввод-вывод • CreateFile – Открытие/создание файлов • CloseHandle – Закрытие файлов • ReadFile – Чтение файлов • WriteFile – Запись файлов • SetFilePointer – Перемещение файлового указателя
Функции времени и даты • 20 (двадцать) : операции с … – локальным и мировым временем – различными форматами • системным • DOS • штампом файла SYSEMTIME STRUCT wYear WORD ? ; 4 цифры wMonth WORD ? ; 1-12 wDayOfWeek WORD ? ; 0-6 wDay wHour wMinute wSecond WORD WORD WORD WORD ? ? ? ? ; ; ; ; 1-31 0-23 0-59 0-59 wMillisec WORD ? ; 0-999 SYSEMTIME ENDS
Часть оконных примитивов • Структуры сложных данных Точка – Область экрана Системное сообщение Класс окна • Необходимые процедуры – MessageBox : Вывод текста в граф.режиме – WinMain : Инициализация граф.приложения – WinProc : Обработка системных событий – ErrorHandler : Обработка ошибок (необяз.) – – –
Оконный сценарий .386 .model flat,STDCALL INCLUDE GraphWin.inc .data ; Определим структурную переменную, описывающую класс окна .code WinMain PROC ; Определим дескриптор текущего процесса ; Загрузим образы пиктограммы и курсора программы. ; Зарегистрируем класс окна ; Создадим основное окно программы ; - если ошибка, отобразим сообщение и остановимся ; Отобразим окно на экране и обновим его содержимое ; Выведем приветственное сообщение ; Создадим цикл обработки сообщений ; Получим новое сообщение из очереди ; Если в очереди больше нет сообщений, остановимся ; Отправим сообщение на обработку процедуре WInProc нашей программы WinMain ENDP WinProc PROC, ; Эта процедура обрабатывает некоторые сообщения, посылаемые системой Windows нашему приложению. ; Щелчок левой кнопкой мыши? ; Окно создано? ; Окно закрыто? ; Обработка сообщений выполняется стандартной процедурой системы WIndows. WinProc ENDP ;--------------------------------------------------- ErrorHandler PROC ; Получим код ошибки ; Определим адрес текстового сообщения об ошибке ; Отобразим сообщение об ошибке ; Освободим память, c cообщением об ошибке ErrorHandler ENDP END WinMain
Памятка интерфейса с ЯВУ • Соглашения о присвоении имён – Компилятором ЯВУ – Компилятором ассемблера • Модель памяти • Соглашение о вызове процедур – Сохраняемые регистры – Передача аргументов • Метод: регистры, стек, память, иное • Порядок: сначала первый или последний • Способ: значение, ссылка, иное – Восстановление стека – Возврат результата • Имена внешних идентификаторов, сегментов • Соглашение о конструкции сложных данных • http://cs.mipt.ru/korotin/korotin_lecture12.ppt
Ассемблерные вставки Visual C++ • Можно – Обращаться к регистрам – Обращаться к меткам и переменным С++ Обращаться к параметру функции по имени Смешивать синтаксис литералов – – Использовать операторы PTR,LENGTH,SIZE,TYPE Загружать адрес командой LEA – – • Нельзя – определять данные директивами – использовать операторы кроме разрешённых выше • определять адрес директивой OFFSET – использовать макроопределения – обращаться к сегментам по имени