АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Доступ к параметрам

Читайте также:
  1. Russian/ China/ Org/ Cn – Режим доступа:http://russian.china.org.cn/exclusive/txt/2011-10/18/content_23658835.htm
  2. Базова (транспортна) мережа та мережа доступу
  3. Биологическая доступность не определяется
  4. Виды прав доступа
  5. Вимоги для системи контролю доступу
  6. Выберите доступный продукт ПриватБанка
  7. Доступ к файлам
  8. Доступна «дешевша» пропозиція по Рашгардам (Без надпису «UKR»)
  9. Доступная и качественная медицинская помощь
  10. Доступность компонентов класса.
  11. ИЗВЛЕЧЕНИЕ РАНЕНЫХ ИЗ ТРУДНОДОСТУПНЫХ МЕСТ.

Когда процедура получает управление, в вершине стека находится адрес возврата: два слова, если подпрограмма ближняя и четыре слова, если подпрограмма дальняя. Выше этого адреса в стеке размещаются параметры, передаваемые этой процедуре. Существуют три основных метода доступа к параметрам:

1) использовать для адресации стека базовый регистр BP, который служит указателем базы при работе с данными в стековых структурах

2) использовать для приема параметров другой базовый регистр или индексный регистр

3) прямой вызов извлечь из стека адрес возврата, а затем извлечь параметры

При этом при извлечении стека из записи, в сохраняемую память адреса возврата следует извлечь передаваемые параметры и поместить их в регистр.

Подобно команде JUMP команда CALL передает управление по адресу с символическим именем, сохраняя адрес возврата. Команда RET считывает адрес возврата из стека и загружает его в сегментный регистр CS и IP, тем самым возвращая управление на команду, следующую в программе за командой CALL.

Отдых – 29,30,1,6,7,8,9. 28 апреля – учимся по понедельнику(числитель). 5 мая – по понедельнику(знаменатель). 12 мая – по субботе в числителе.

О сновные команды обработки строк. Представление строк и символов

Строка символов может быть определена переменной, тип которой указывает смещение начала строки. В языке ассемблер нет универсального формата хранения строк-символов. Возможны следующие варианты:

1) буфер фиксированной длины. Этот буфер содержит число символов, заранее определенных в переменной, а неиспользованные ячейки в конце буфера заполняются пробелами.

2) Дескриптор длины – байт, хранящийся в начале строки. Неиспользованные позиции в строки являются неопределенными.

3) Строка с нулевым окончанием (строки ASCII), представляют собой символы, заканчивающиеся нулевым байтом. Действительная длина строки может находится в диапазоне от 0 до числа байтов, установленного при определении строки. Неиспользованные позиции считаются неопределенными.

Строка символов в ассемблере – последовательность байт. Цепочка символов – последовательность элементов, размером больше байта. Команды строковых примитивов – цепочечные команды. Цепочечные команды позволяют проводить действия над блоками памяти, представляющие собой последовательность элементов следующего размера (байт, слово, двойное слово). Главное, чтобы размерность элементов была 8, 16 или 32 и эти элементы находились в соседних ячейках памяти. Команды строковых примитивов удобны, но их использование, но их использование сопряжено с некоторыми трудностями, так как процессор, выполняя эти команды неявным образом, использует ряд своих регистров (нельзя использовать CI,DI). Только если регистры-указатели настроены должным образом, то команда будет выполняться правильно. Основной задачей регистров-указателей хранить индекс или смещение относительно некоторой базы при выборе операнда из памяти. Преимущество команд строковых примитивов: эти команды могут автоматически повторяться, благодаря встроенному в команду циклу, пока не конец строки. Особенностью этих команд является то, что они могут иметь 2 операнда в памяти. По сравнению в командой mov наблюдается значительное повышение производительности при их использовании для обработки строк. В программе добавляется от 6 до 9 дополнительных предложений. Особенности работы команд строковых примитивов: содержимое строки для микропроцессора не имеет значения, поэтому это могут быть символы, числа и все, что угодно. Основное, что имеет значение – длина операнда. Длина строки в базовом ассемблере меньше или равна 64 кб. Первый операнд строка-приемник адресуется через группу регистров <ES:DI>, это значит, что строка-приемник должна находиться в дополнительном сегменте памяти (регистр ES – регистр хранения сегментной части адреса переменных, со смещением DI). Строка-источник адресуется через регистры <DS:SI>, при этом строка-источник должна находиться в сегменте данных, который определяет регистр DS со смещением, хранящемся в регистр SI. Операнды, находящиеся в памяти всегда адресуются одинаково. В регистр ES необходимо указать начало сегмента данных ещё до того, как будут использоваться команды работы со строками. В процессе циклического выполнения команд, указатели SI и DI автоматически модифицируются, в зависимости от длины элемента строки и от значения флага направления. Это значит, что в процессе обработки строк регистры SI и DI автоматически смещаются по строке вперед или назад. Флаг направления на передачу блока данных при выполнении команд перемещения (movs), сравнения (cmps) и сканирования (scans).

Команды обработки строк не влияют на состояние флагов, мы должны сами определить направление и сами установить флаг, используя для этого команды CLD или STD. Каждая команда строковых примитивов имеет 3 дополнительных формата – в конце команды указывается первая буква типа. Команды обработки строк, как правило, включаются в программу без явного указания операндов, хотя каждый из них использует 2 операнда. Для команд movs и cmps оба операнда находятся в памяти. SCAS и STOS – операнд источник – регистры Ax,Al,Eax. Формат команды не привязан к размеру операнда, поэтому операнды должны быть явно определены. При однократном выполнении команды, обрабатывается только один элемент, поэтому для обработки строки команды должны повторяться с использованием префикса повторения, который заставляет выполнять команду выполняться несколько раз. Префикс REP заставляет команды копирования и сохранения в аккумулятор повторяться столько раз, сколько записано в регистре Cx. REPZ,REPE используются для команд cmps, scas. Также, REPNZ,REPNE. (!) Команды сравнения и сканирования влияют на состояние флага нуля. Для правильного выполнения команд обработки строк необходимо: 1) правильно настроить регистры; 2) установить или сбросить флаг направления; 3) занести в Cx длину обрабатываемой строки; 4) для команд сканирования и сохранения поместить операнд-источник в регистр Ax. Строки обрабатываемые рассматриваемыми командами могут находиться в любом месте памяти: в сегменте данных программы, в системных областях данных, в ПЗУ, в видеопамяти.

 

Лекция про макросы (…)

Класс

Данный параметр используется для комбинирования сегментов с разными именами. Тип класса это просто строка, заключенная в кавычки. Сегменты с одинаковым типом класса загружаются вместе, хотя могут находиться в разных местах программы. Для того, чтобы установить соответствие между сегментами кода и регистра CS необходимо прописать в программе assume CS:code,DS:data; Эта строка говорит о том, что сегмент кода является сегментом команд и встречающиеся в этом сегменте метки принадлежат именно этому сегменту. Для обращения к памяти необходимо иметь 2 составляющих в памяти: сегментный адрес и смещение внутри этого сегмента. Сегментный адрес всегда находится в сегментном регистре, но так как в процессоре их 2 (DS,ES), то для обращения можно использовать любой из них, (!) дополнительный сегментный регистр ES используется для обращения к полям данных, не входящим в программу, например, для обращения к видеопамяти, системным ячейкам, но, если программа работает с большим объемом данных, для них нужно предусмотреть два сегмента, то к первому сегменту обращаются через DS, а ко второму через ES. Следует помнить, что к моменту выполнения команды обращения к памяти, регистры совсем не обязательно содержат сегментный адрес требуемого сегмента, поэтому практически любая программа должна начинаться с предложений, в которых в сегментный регистр, используемый для адресации сегмента данных, заносится сегментный адрес этого сегмента.

DS,ES

Префикс программы (PSP) 256 байт

CS Сегмент команд IP

Сегмент данных

S Сегмент стека SP

Важно помнить, что в оперативную память сегменты попадают в том порядке, в котором они описаны в коде программы. Если специальными средствами ассемблера не задать иной порядок. При загрузке программы сегменты размещаются в указанном выше порядке. Программа в памяти начинает сегмент префикса программы, который образуется и заполняется системой, представляя собой новое адресное пространство. Префиксы программы содержат указатели переменных и дополнительную информацию, используемую системой в процессе выполнения программы. Сегментные регистры инициализируются автоматически следующим образом: в регистрах ES,DS указывают на сегмент префикса программы, что делает возможным, сохранив их содержимое, обращаться в программе к данному адресному пространству. Регистр CS указывает на начало сегмента команд, SS – на начало сегмента стека, а в регистр IP загружается относительный адрес точки входа в программу. Указатель стека – величина равная объявленному размеру стека. После загрузки программы в память адресуемыми оказываются все сегменты кроме сегмента данных. Любой адрес ячейки памяти состоит из двух слов, первое определяет расположение в памяти соответствующего сегмента, а второе смещение в пределах этого сегмента. В процессоре сегментная часть адреса после её умножения на 16, определяет физический адрес начала сегмента в памяти. Сегмент всегда начинается с адреса кратного 16. Размер сегмента определяется содержащимися в нем данными, но никогда не превышает 64кб, что определяется максимально возможной величиной смещения.

Стек

Стек – ограниченный специальным образом участок памяти, который используется для временного хранения переменных, передачи параметров вызываемых программ и сохранение адреса возврата при вызове процедур и прерываний. Стек используется для: 1) сохранения содержимого регистров, используемых программой перед вызовом подпрограмм, которые в свою очередь будут использовать регистры в своих личных целях. Исходное содержимое регистров извлекается из стека после возврата. Стек используется для передачи подпрограмме требуемых ей параметров через стек. Подпрограмма в стеке хранит свои параметры в заданном порядке, что позволяет их оптимально использовать. Отличительной особенностью стека является то, что в любой момент времени в стеке доступен только верхний элемент, то есть элемент, загруженный последним, поэтому выгрузка из стека верхнего элемента делает доступным следующий элемент. Элементы стека располагаются в области памяти, отведенной под стек, начиная со дна, то есть с максимального адреса, соответственно дальше адрес уменьшается. (!) Как и любая другая область памяти, стек должен входить в какой-то сегмент или образовывать отдельный сегмент. Если программа совсем не использует стек, то он должен присутствовать в программе и иметь размер не менее десятка слов. За работой стека следит пара регистров SS и SP. SS хранит сегментный адрес стека, а SP хранит смещение последнего сохраненного в стеке данного. Доступным будет тот элемент стека, на который указывает указатель стека, а после выгрузки, сохраненные в стек данные физически сохраняются на своих местах, но являются недоступными при стандартной работе со стеком. Особенности выполнения команды помещения в стек (push) – проталкивать в стек можно только целые слова (не байты!); если стек используется для временного хранения данных, то извлекать эти данные стека следует в порядке обратном их сохранению. В качестве операнда-источника может быть использован любой 16 или 32 разрядный регистр, включая сегментный. Команда Push не воздействует на флаги процессора. Для команды POP программа должна строго следить, чтобы команде PUSH строго соответствовала команда POP. В качестве операнда-приемника можно использовать любой регистр, кроме регистра сегмента кода. Языки высокого уровня создают пространство в стеке для подпрограмм, и это пространство называется «стековым фреймом». В этом пространстве размещаются временные переменные, создаваемые подпрограммой, и при возврате они удаляются.


1 | 2 | 3 | 4 | 5 | 6 | 7 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)