Скачать 0.7 Mb.
|
Урок 1 Немного истории. Теперь о памяти. В ДОС и в windows 3.Х память была сегментной. Вся память делилась на сегменты по 64 КВ., и адрес (именно адрес, а не смещение) задавалась, форматом сегмент: офсет. Сегмент задаёт порядковый номер сегмента, а офсет задаёт смещение чего-либо в этом сегменте.
Учтите, что это объяснение для 16-разрядных программ, о 32-разрядных я расскажу позже, (но не пропускайте эту часть, важно понять, что такое 32-разрядность). Таблица выше иллюстрирует общую память, разделенную на сегменты по 64kb. Здесь максимум 65536 сегментов. Теперь возьмите один из сегментов:
Вы спросите, зачем нужна эта сегментность. Всему есть разумное объяснение. Дело в том в том, что ДОС 16 битный. И регистры 16 битные. С помощью 16 бит можно адресовать только 65536 байт памяти и 65536 сегментов. Например: 0030:4012 (всё шестнадцатиричное) Это означает: сегмент 30, смещение 4012. Чтобы узнать, что находится в том адресе, вы сначала переходите на сегмент 30, а затем в сегменте смещаетесь на 4012. В предыдущих уроках мы узнали о сегментных и указательных регистрах. Например, сегментные регистры:
Названия говорят о их функциях: сегмент кода (CS) содержит номер секции, где вылнен текущий код. Сегмент данных для получения данных из текущего сегмента. На стек указывает сегмент стека (SS) (подробнее о стеке я раскажу позже), ES, FS, GS - универсальные регистры и могут использоваться для любого сегмента (не в win32). Теперь о Win32. В 16-разрядном программировании, сегменты необходимы. К счастью, эта проблема решена в 32-разрядном Windows (95 и выше). Вы все еще имеете сегменты, но вам не нужно заботиться о них, потому, что они уже не 64kb (как в 16-разрядном), а 4 Гб. Windows вероятно даже "повиснет", если вы попытаетесь изменить один из сегментных регистров. Это называеся плоской моделью памяти (flat). Здесь есть только смещения и они теперь 32-разрядные (в диапазоне от 0 до 4,294,967,295). Каждая ячейка в памяти указывается смещением. Это действительно одно из лучших преимуществ 32-разрядного программирования над 16-разрядным. Так что теперь вы можете забыть о сегментных регистрах и сосредоточиться на других регистрах. Вот общая схема памяти в Win32. Но 4ГБ может и не быть на машине, поэтому эта память называется виртуальной. Мало того, каждый процесс выполняется в своём виртуальном адресном пространстве. А это значит, что никакой другой процесс не сможет получить доступ к вашей памяти. Для этого существуют специальные API функции, но для их использования нужно иметь специальные привилегии в системе. Память 0-0000FFFF не используется и служит для выявления нулевых указателей, значит, если вы укажете адрес 0000С567, то он будет считаться нулевым, удобно, не правда ли? Любая попытка обратится к этой памяти приводит к ошибке. Память выше 80000000 одна для всех процессов. В этой памяти находится код нулевого кольца, структуры ядра, код планировщика задач, код драйверов, диспетчер ввода вывода, таблица прерываний и т.д. Любая попытка обратиться к памяти ядра приводит к ошибке и к немедленному завершению приложения. Память в диапазоне 00001000-7FFFFFFF доступна для 3 кольца, т.е. для вашего приложения. С ней вы, что хотите то и делаете, в неё также грузятся DLL-ки. Выделение памяти. Если вам даётся 2ГБ памяти, то это не означает, что вы можете обратиться к любому участку памяти. Для того чтобы получить доступ к некоторому участку памяти надо сначала её зарезервировать. Грубо говоря, перед резервированием памяти, резервируемого участка памяти просто не существует (я не оговорился её просто не существует), вы как бы его создаёте и задаёте ему атрибуты доступа (полный доступ, только чтение, только запись, нет доступа). Минимальный размер выделяемой памяти - страница, равна 1000 байтам (для тех, кто не привык к шестнадцатеричной записи, это 4096 байт - 4КБ). Даже если вы захотите выделить 5 байт, то всё равно выделится 4КБ. Такой метод распределения памяти называется гранулярность. Думаю, вы не столкнётесь с тем, что вам надо будет выделять память, лично мне это ни разу не пригодилось. Это нужно при работе с файлами для того, что бы в эту память читать файл. Урок 2 Команды процессору - это просто коды или коды операций или опкоды. Опкоды - фактически "читаемый текст"- версии шестнадцатеричных кодов. Из-за этого, ассемблер считается самым низкоуровневым языком программирования, все в ассемблере непосредственно преобразовывается в шестнадцатеричные коды. Другими словами, у вас нет компилятора, который преобразовывает язык высокого уровня в язык низкого уровня, ассемблер только преобразовывает коды ассемблера в данные. В этом уроке мы обсудим несколько опкодов, которые имеют отношение к вычислению, поразрядным операциям, и т.д. Другие опкоды: команды перехода, сравнения и т.д, будут обсуждены позже. Комментарии в ваших программах оставляются после точки с запятой. Точно также как в дельфи или си через //. Числа в ассемблере могут представляться в двоичной, десятеричной или шестнадцатеричной системе. Для того, чтобы показать в какой системе использовано число надо поставить после числа букву. Для бинарной системы пишется буква b (пример: 0000010b, 001011010b), для десятеричной системы можно ничего не указывать после числа или указать букву d (примеры: 4589, 2356d), для шестнадцатеричной системы надо указывать букву h, шестнадцатеричное число надо обязательно писать с нулём в начале (примеры: 00889h, 0AC45h, 056Fh, неправильно F145Ch, С123h). Самая первая команда будет хорошо всем известная MOV. Эта команда используется для копирования (не обращайте внимания на имя команды) значения из одного места в другое. Это 'место' может быть регистр, ячейка памяти или непосредственное значение (только как исходное значение). Синтаксис команды: mov приемник, источник Вы можете копировать значение из одного регистра в другой. mov edx, ecx Вышеприведенная команда копирует содержание ecx в edx. Размер источника и приемника должны быть одинаковыми, например: эта команда - НЕ допустима: mov al, ecx ; не правильно Этот опкод пытается поместить DWORD (32-битное) значение в байт (8 битов). Это не может быть сделано mov командой (для этого есть другие команды). А эти команды правильные, потому что у них источник и приемник не отличаются по размеру: mov al, bl mov cl, dl mov cx, dx mov ecx, ebx Вы также можете получить значение из памяти и поместить эго в регистр. Для примера возьмем следующую схему памяти:
(Каждый блок представляет байт) Значение смещения обозначено здесь как байт, но на самом деле это это - 32-разрядное значение. Возьмем для примера 3A, это также - 32-разрядное значение: 0000003Ah. Только, чтобы с экономить пространство, некоторые используют маленькие смещения. Посмотрите на смещение 3A в таблице выше. Данные на этом смещении - 25, 7A, 5E, 72, EF, и т.д. Чтобы поместить значение со смещения 3A, например, в регистр, вы также используете команду mov: mov eax, dword ptr [0000003Ah] Означает: поместить значение с размером DWORD (32-бита) из памяти со смещением 3Ah в регистр eax. После выполнения этой команды, eax будет содержать значение 725E7A25h. Возможно вы заметили, что это - инверсия того что находится в памяти: 25 7A 5E 72. Это потому, что значения сохраняются в памяти, используя формат little endian . Это означает, что самый младший байт сохраняется в наиболее значимом байте: порядок байтов задом на перед. Я думаю, что эти примеры покажут это:
Вернемся к примеру выше. Вы также можете это делать и с другими размерами: mov cl, byte ptr [34h] ; cl получит значение 0Dh mov dx, word ptr [3Eh] ; dx получит значение 7DEFh Вы, наверное, уже поняли, что префикс ptr обозначает, что надо брать из памяти некоторый размер. А префикс перед ptr обозначает размер данных: Byte - 1 байт Word - 2 байта Dword - 4 байта Иногда размер можно не указывать: mov eax, [00403045h] Так как eax - 32-разрядный регистр, ассемблер понимает, что ему также требуется 32-разрядное значение, в данном случае из памяти со смещением 403045h. Можно также непосредственные значения: mov edx, 5006h Эта команда просто запишет в регистр edx, значение 5006. Скобки, [ и ], используются, для получения значения из памяти (в скобках находится смещение), без скобок, это просто непосредственное значение. Можно также использовать регистр как ячейку памяти (он должен быть 32-разрядным в 32-разрядных программах): mov eax, 403045h ; пишет в eax значение 403045 mov cx, [eax] ; помещает в регистр CX значение (размера word) из памяти ; указанной в EAX (403045) В mov cx, [eax], процессор сначала смотрит, какое значение (= ячейке памяти) содержит eax, затем какое значение находится в той ячейке памяти, и помещает это значение (word, 16 бит, потому что приемник, cx, является 16-разрядным регистром) в CX. Стековые операции - PUSH, POP. Перед тем, как рассказать вам о стековых операциях, я уже объяснял вам, что такое стек. Стек это область в памяти, на которую указывает регистр стека ESP. Стек это место для хранения адресов возврата и временных значений. Есть две команды, для размещения значения в стеке и извлечения его из стека: PUSH и POP. Команда PUSH размещает значение в стеке, т.е. помещает значение в ячейку памяти, на которую указывает регистр ESP, после этого значение регистра ESP увеличивается на 4. Команда Pop извлекает значение из стека, т.е. извлекает значение из ячейки памяти, на которую указывает регистр ESP, после этого уменьшает значение регистра ESP на 4. Значение, помещенное в стек последним, извлекается первым. При помещении значения в стек, указатель стека уменьшается, а при извлечении - увеличивается. Рассмотрим пример: (1) mov ecx, 100 (2) mov eax, 200 (3) push ecx ; сохранение ecx (4) push eax (5) xor ecx, eax (6) add ecx, 400 (7) mov edx, ecx (8) pop ebx (9) pop ecx Анализ:
Чтобы узнать, что происходит в памяти, при размещении и извлечении значений в стеке, см. на рисунок ниже: (стек здесь заполнен нулями, но в действительности это не так, как здесь). ESP стоит в том месте, на которое он указывает) mov ax, 4560h push ax mov cx, FFFFh push cx pop edx edx теперь 4560FFFFh. Вызов подпрограмм возврат из них - CALL, RET. Команда call передает управление ближней или дальней процедуре с запоминанием в стеке адреса точки возврата. Команда ret возвращает управление из процедуры вызывающей программе, адрес возврата получает из стека. Пример: ..code.. call 0455659 ..more code.. Код с адреса 455659: add eax, 500 mul eax, edx ret Когда выполняется команда call, процессор передает управление на код с адреса 455659, и выполняет его до команды ret, а затем возвращает управление команде следующей за call. Код который вызывается командой call называется процедурой. Вы можете поместить код, который вы часто используете в процедуру и каждый раз когда он вам нужен вызывать его командой call. Подробнее: команда call помещает регистр EIP (указатель на следующюю команду, которая должна быть выполнена) в стек, а команда ret извлекает его и передаёт управление этому адресу. Вы также можете определить аргументы, для вызываемой программы (процедуры). Это можно сделать через стек: push значение_1 push значение_2 call procedure Внутри процедуры, аргументы могут быть прочитаны из стека и использованы. Локальные переменные, т.е. данные, которые необходимы только внутри процедуры, также могут быть сохранены в стеке. Я не буду подробно рассказывать об этом, потому, что это может быть легко сделано в ассемблерах MASM и TASM. Просто запомните, что вы можете делать процедуры и что они могут использовать параметры. |
Развитие памяти ребенка как необходимое условие успешного обучения... Платон первый среди ученых заговорил о памяти как о самостоятельном психическом процессе. Он дал следующее определение: Память –... |
Одним из самых трагических и важных событий XX века стала борьба... Великая Отечественная война. Сегодня каждый житель района чтит память земляков, не вернувшихся с полей сражений, помнит подвиги великих... |
||
Преступления, совершённые за два с половиной года великой чистки... Общественная атмосфера, которая была порождена попытками обуздать, стереть историческую память народа, ярко передана в поэме А. Твардовского... |
Положение о проведении Всероссийского театрального фестиваля-конкурса,... Целью Конкурса является сохранение памяти о событиях Великой Отечественной войны, Второй Мировой войны и жертвах Холокоста |
||
О реализации в Республике Башкортостан Федерального патриотического... Федеральный патриотический проект «Память и гордость в сердцах поколений» (далее – Проект) осуществляется в Республике Башкортостан... |
Учебно-методическое пособие по самоподготовке для студентов тема: Память. Развитие памяти Что в жизни может быть лучше интересного собеседника, яркой интеллектуально развитой личности, способной в нужный момент вспомнить... |
||
Название предприятия, почтовый адрес, контактные телефоны, факс,... |
«Но грянул бой…» аллея живой памяти Вед. 1: 22 июня… Этот день будет вечно отбрасывать нашу память к 1941году, а значит, и к 9 мая 1945 года. Между двумя датами прочная... |
||
25 мая 2016 года №5 (40) периодическое печатное издание Администрации... Ого праздника Победы, жители и гости посёлка Штурм собрались у Аллеи и Мемориала Славы, чтобы почтить память всех тех, кто смог подарить... |
Инструкция по эксплуатации код 392291 К/память Verbatim 2Gb/sd micro На сегодня одной из самых маленьких существующих карт памяти является карта Microsd (TransFlash), которая позволяет хранить большое... |
||
Тема 1: «Актуальные вопросы кадровика на сегодня» Почтовый адрес / адрес местонахождения офиса: 129110 г. Москва, Проспект Мира, д. 52 Юридический адрес: 141092, Московская обл.,... |
О проведении редукциона в электронной форме Наименование, юридический (почтовый) адрес, фактический адрес, адрес электронной почты, номера контактных телефонов |
||
1 Наименование заказчика, его почтовый адрес, адрес электронной почты Муниципальное учреждение «Торжокская центральная районная больница» почтовый адрес: 172010, Тверская обл |
Документация об аукционе №48 эа/2016 Наименование, место нахождения, почтовый адрес, адрес электронной почты, номер контактного телефона, ответственное должностное лицо... |
||
Документация об аукционе №44ЭА/2015 Наименование, место нахождения, почтовый адрес, адрес электронной почты, номер контактного телефона, ответственное должностное лицо... |
Наименование, место нахождения, почтовый адрес, адрес электронной... «Мурманский областной консультативно-диагностический центр» (место нахождения и почтовый адрес: Россия, 183047, г. Мурманск, ул.... |
Поиск |