Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65431
ТЕХНОЛОГИИ ДОСТ... 62379
Имитационное мо... 58018
Реклама
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

Пользователей: 13,089
новичок: duskob67
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема
Моделирование процесса обеспечивающего надежность функционирования АСУ Т...
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Работа с адресами и указателями
При написании программ на ассемблере производится интенсивная работа с адре-
сами операндов, находящимися в памяти. Для поддержки такого рода операций
есть специальная группа команд, в которую входят следующие команды.
lea <приемник>,<источник> — загрузка эффективного адреса;
Ids <приемник>,<источник> — загрузка указателя в регистр сегмента данных ds;
les <приемник>,<источник> — загрузка указателя в регистр дополнительного сег-
мента данных es;
Igs <приемник>,<источник> — загрузка указателя в регистр дополнительного сег-
мента данных gs;
* Ifs <приемник>,<источник> — загрузка указателя в регистр дополнительного сег-
мента данных fs;
ii Iss <приемник>,<источник> — загрузка указателя в регистр сегмента стека ss.
Команда LEA похожа на команду MOV тем, что она также производит пересылку,
однако команда LEA производит пересылку не данных, а эффективного адреса дан-
ных (то есть смещения данных относительно начала сегмента данных) в регистр,
указанный операндом <приемник>.
Часто для выполнения некоторых действий в программе недостаточно знать
значение одного лишь эффективного адреса данных, а необходимо иметь полный
указатель на данные. Вы помните, что полный указатель на данные состоит из сег-
ментной составляющей и смещения. Все остальные команды этой группы позво-
ляют получить в паре регистров такой полный указатель на операнд в памяти. При
этом имя сегментного регистра, в который помещается сегментная составляющая
адреса, определяется кодом операции. Соответственно, смещение помещается
в регистр общего назначения, указанный операндом <приемник>. Но не все так про-
сто с операндом <источник>. На самом деле в команде в качестве источника нельзя
указывать непосредственно имя операнда в памяти, на который мы бы хотели по-
лучить указатель. Предварительно необходимо получить само значение полного
указателя в некоторой области памяти и задать в команде получения полного ад-
реса имя этой области. Для выполнения этого действия необходимо вспомнить
директивы резервирования и инициализации памяти (см. главу 5). При примене-
нии этих директив возможен частный случай, когда в поле операндов указывается
имя другой директивы определения данных (фактически, имя переменной). В этом
случае в памяти формируется адрес этой переменной. Какой адрес будет сформи-
рован (эффективный или полный), зависит от применяемой директивы. Если это
DW, то в памяти формируется только 16-разрядное значение эффективного ад-
реса, если же DD — в память записывается полный адрес. Размещение этого
адреса в памяти следующее: в младшем слове находится смещение, в старшем —
16-разрядная сегментная составляющая адреса. Посмотрите на листинг 5.3
и рис. 5.20 (глава 5). В сегменте данных программы из листинга 5.3 переменные
adr и adr_full иллюстрируют наш случай получения частичного и полного указате-
лей на данные в памяти.
Например, при организации работы с цепочкой символов удобно поместить ее
начальный адрес в некоторый регистр и далее в цикле модифицировать это значе-
ние для последовательного доступа к элементам цепочки. В листинге 7.2 произво-
дится копирование строки байтов str_l в строку байтов str_2. В строках 13 и 14
в регистры SI и DI загружаются значения эффективных адресов переменных str_l
и str_2. В строках 18,19 производится пересылка очередного байта из одной стро-
ки в другую. Указатели на позиции байтов в строках определяются содержимым
регистров SI и DI. Для пересылки очередного байта необходимо увеличить на еди-
ницу регистры SI и DI, что и делается командами сложения ШС (строки 20,21). После
этого программу необходимо зациклить до обработки всех символов строки.

Листинг 7. 2. Копирование строки
<1> ; - Prg_7_2.asm -
<2> masm
<3> model small
<4> .data
<5> ...
<6> str_l db "Ассемблер - базовый язык компьютера"
<7> str_2 db 35 dup (" ")
<8> full_pnt dd str_l
<9> ...
<10> .code
<11> start:
<13> lea si ,str_l
<14> lea di ,str_2
<15> les bx,full_pnt ;полный указатель на strl в пару es:bx
<16> mov ex, 35 ;счетчик цикла для loop ml (глава 10)
<17> ml:
<18> mov al , [si ]
<19> mov [di] ,al
<20> inc si
<21> inc di
<22> ;цикл на метку ml до пересылки всех символов (loop ml)
<23>
<24> end start




Необходимость использования команд получения полного указателя данных
в памяти, то есть адреса сегмента и значения смещения внутри сегмента, возника-
ет, в частности, при работе с цепочками. Мы рассмотрим этот вопрос в главе 12.
В строке 8 листинга 7.2 в двойном слове fulLpnt формируются сегментная часть
адреса и смещение для переменной str_l. При этом два байта смещения занимает
младшее слово fulLpnt, а значение сегментной составляющей адреса — старшее
слово fulLpnt. В строке 15 командой LES эти компоненты адреса помещаются в регис-
тры ВХ и ES.
Опубликовал Kest January 04 2009 00:52:44 · 0 Комментариев · 16635 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
DateEdit
Cтатьи Королевств...
Delphi. Учимся на...
MPTools
Strawberry Prolog...
Rss Parser
Трассировка прово...
Использование Lis...
Искусство програм...
Архив Апгрейтов с...
45 уроков по дельфи
Задача о 8ми ладьях
База каталогов ( ...
Пример клиента ФТ...
Время загрузки ...
Калькулятор [Исхо...
Аватары в комме...
DS_Group
Pass [Исходник на...
DiskInfo

Топ загрузок
Приложение Клие... 100472
Delphi 7 Enterp... 87498
Converter AMR<-... 20081
GPSS World Stud... 13096
Borland C++Buil... 11941
Borland Delphi ... 8633
Turbo Pascal fo... 7042
Visual Studio 2... 5002
Калькулятор [Ис... 4860
FreeSMS v1.3.1 3544
Случайные статьи
Полоса погрешностей
неотрицательность...
Как получить много...
Получить массив Х(...
Управление связанн...
Разреженные структ...
Обеспечение основн...
display(X)
Invalid symbol ref...
Требование синхрон...
Обучение программи...
Разборка Mac на части
4.4. ДОПУСТИМЫЕ СП...
Сигналы. Знакомств...
Установление связе...
Eastern women
Как обойти AVP
Контроль значений ...
Б модуль
Сливочные десерты
Нормализаторы вычи...
SDECREMENT (УМЕНЬШ...
использования в их...
Глава 7
OpenGL. МИНИМАЛЬНА...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?