Учебный курс Архитектура ЭВМ и язык ассемблера Лекция 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