1 / 27

Учебный курс

Учебный курс. Архитектура ЭВМ и язык ассемблера Лекция 4 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович. Активационные записи: стековые фреймы. • Состав – Параметры – Точка возврата – Сохранённые регистры

elijah
Download Presentation

Учебный курс

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Учебный курс Архитектура ЭВМ и язык ассемблера Лекция 4 заместитель министра связи и массовых коммуникаций РФ,старший преподаватель Северов Дмитрий Станиславович

  2. Активационные записи: стековые фреймы • Состав – Параметры – Точка возврата – Сохранённые регистры – Локальные переменные • Типичные действия – аргументы – в стек – вызвать процедуру – EBP – в стек – ESP – в EBP – локальные – в стек – <целевыедействия> – вернуться/восстановить • CS:EIP • SS:ESP • Остальной контекст • Модели памяти – TINY – SMALL – MEDIUM – COMPACT – LARGE – HUGE – FLAT • Описатель ЯВУ – BASIC – C – FORTRAN – PASCAL – STDCALL – SYSCALL • Тип стека

  3. Модели памяти 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

  4. Описатели ЯВУ SDTCALL C PASCAL Размещение в стеке Обратное Обратное Прямое Возвращает стек обратно Вызываемый ret?? SDTCALL Вызывающий Вызываемый add esp,?? ret ?? PASCAL C

  5. Рекурсия 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 ; очистить стек

  6. Некоторые отличия режимов • Размер сегментов • Совмещение сегментов • Доступность сегментных регистров • Ограничения базово-индексной адресации – RM: [bx+si],[bx+di],[bp+si],[bp+di] • Счётчик по умолчанию • Вычисление линейного адреса

  7. Вычисление адресов в режиме PM • Дескриптор сегмента – Начало Логический адрес Селектор(16) Смещение(32) Линейныйадрес(32) – Уровень привилегий Каталог(10) Таблица(10) Смещение(12) + Таблица дескрипторов Дескриптор сегмента GTDR/LDTR(32) Таблица страниц Эл-т таблицы(32) Физический адрес(32) – Тип, способ доступа – Присутствие – Гранула – Длина Страничный каталог Эл-т каталога(32) CR3(32) + • GDT – общие сегменты • LDT – сегменты, специфические для задачи

  8. Массивы и строки • Присвоить массив – Установить начала источника и получателя в регистрах DS:ESI, ES:EDI – Установить направление изменения адресов командами CLD, STD – Установить количество пересылок в регистре ECX – Многократно выполнить пересылку командой с префиксом: repmovsbrepmovsw, repmovsd • Префиксы для строк: repz/reperepnz/repne • Сравнить cmps? сканировать scas? сохранить stos? загрузить lods?

  9. Двумерные массивы 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

  10. Структуры • Определение типа 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

  11. Объединения • Определение типа 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

  12. Макрокоманды • Определение 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

  13. Условное ассемблирование • Если IF выражение IFB <аргумент> IFIDN <арг.>,<значение> IFDEF имя …а также IFNB IFIDNI IFDIF IFDIFI IFNDEF • То ELSE • Завершить ENDIF EXITM • Проверка аргументов • Значения по умолчанию аргумент := <значение> • Операторы в выражении LT GT EQ NE LE GE • Подстановка значения & • Вычисление выражения % • Обозначение текста <почти любой текст> • Обозначение символа !

  14. Макрофункции • Определение IsDefined MACRO symbol IFDEFsymbol EXITM <-1> ;; Истина ELSE EXITM <0> ;; Ложь ENDM • Вызов … RealMode=1 … IF IsDefined( RealMode ) mov ax,@data mov ds,ax ENDIF

  15. Блоки повторения • По условию .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. Пробелы в «пунктире» лекций • Создание 16-ти разрядных программ DOS • Программирование с функциями BIOS • Использование средств программирования • Примеры и задачи

  17. Терминал Windows • Специальное связывание – LINK … /SUBSYSTEM:CONSOLE • Две модели – две группы функций ввода-вывода – Простейшая, канальная, потоковая • Очереди символов – Низкоуровневая • Входной буфер – очередь записей о событиях ввода • Буфер экрана – двумерный массив данных и атрибутов отображаемого текста • Две кодировки – ASCII/ANSI <имя_функции>A – Unicode <имя_функции>W • Два набора наименований типов данных • Разрушаются: EAX, EBX, ECX, EDX

  18. Терминал Windows (продолжение) • Дескрипторы терминала из SmallWin.inc – Стандартного канала ввода: STD_INPUT_HANDLE – Стандартного канала ввода: STD_OUTPUT_HANDLE – Стандартного канала диагностики: STD_ERROR_HANDLE .data inputHandle DWORD ? .code INVOKE GetStdHandle, STD_INPUT_HANDLE movinputHandle,eax • Необходимые дополнительные действия – Получить дескриптор – Сохранить, установить, восстановить режим

  19. Терминальные функции • Согласование типов ОС и ассемблера • 43 (сорок три) функции по Ирвайну: операции с … – – – – окнами терминалами дескрипторами буферами записями режимами символами атрибутами кодировками курсорами – – – – – –

  20. Вывод на консоль 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

  21. Чтение с консоли 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

  22. Файловый ввод-вывод • CreateFile – Открытие/создание файлов • CloseHandle – Закрытие файлов • ReadFile – Чтение файлов • WriteFile – Запись файлов • SetFilePointer – Перемещение файлового указателя

  23. Функции времени и даты • 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

  24. Часть оконных примитивов • Структуры сложных данных Точка – Область экрана Системное сообщение Класс окна • Необходимые процедуры – MessageBox : Вывод текста в граф.режиме – WinMain : Инициализация граф.приложения – WinProc : Обработка системных событий – ErrorHandler : Обработка ошибок (необяз.) – – –

  25. Оконный сценарий .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

  26. Памятка интерфейса с ЯВУ • Соглашения о присвоении имён – Компилятором ЯВУ – Компилятором ассемблера • Модель памяти • Соглашение о вызове процедур – Сохраняемые регистры – Передача аргументов • Метод: регистры, стек, память, иное • Порядок: сначала первый или последний • Способ: значение, ссылка, иное – Восстановление стека – Возврат результата • Имена внешних идентификаторов, сегментов • Соглашение о конструкции сложных данных • http://cs.mipt.ru/korotin/korotin_lecture12.ppt

  27. Ассемблерные вставки Visual C++ • Можно – Обращаться к регистрам – Обращаться к меткам и переменным С++ Обращаться к параметру функции по имени Смешивать синтаксис литералов – – Использовать операторы PTR,LENGTH,SIZE,TYPE Загружать адрес командой LEA – – • Нельзя – определять данные директивами – использовать операторы кроме разрешённых выше • определять адрес директивой OFFSET – использовать макроопределения – обращаться к сегментам по имени

More Related