41. Сегментные регистры. Информатика и информационные технологии
41. Сегментные регистры. Информатика и информационные технологииВикиЧтение
Информатика и информационные технологии
Цветкова А В
Содержание
41. Сегментные регистры
В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs.
Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Соответственно такая организация памяти называется сегментной.
Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически (с небольшой поправкой) в этих регистрах содержатся адреса памяти, с которыхначинаются соответствующие сегменты.
Микропроцессор поддерживает следующие типы сегментов.
1. Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр cs (code segment register) – сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (т. е. эти команды загружаются в конвейер микропроцессора).
2. Сегмент данных. Содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр ds (data segment register) – сегментный регистр данных, который хранит адрес сегмента данных текущей программы.
3. Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) – сегментный регистр стека, содержащий адрес сегмента стека.
4. Дополнительный сегмент данных. Не явно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds. Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).
Данный текст является ознакомительным фрагментом.
3. Пользовательские регистры
3. Пользовательские регистры Как следует из названия, пользовательскими регистры называются потому, что программист может использовать их при написании своих программ. К этим регистрам относятся (рис. 2):1) восемь 32-битных регистров, которые могут использоваться
4. Регистры общего назначения
4. Регистры общего назначения Все регистры этой группы позволяют обращаться к своим «младшим» частям. Использовать для самостоятельной адресации можно только младшие 16– и 8-битные части этих регистров. Старшие 16 бит этих регистров как самостоятельные объекты
6. Регистры состояния и управления
6. Регистры состояния и управления В микропроцессор включены несколько регистров, которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:1) регистр
ЛЕКЦИЯ № 15. Регистры
ЛЕКЦИЯ № 15. Регистры 1. Системные регистры микропроцессора Само название этих регистров говорит о том, что они выполняют специфические функции в системе. Использование системных регистров жестко регламентировано. Именно они обеспечивают работу защищенного режима. Их
2. Регистры управления
4. Регистры отладки
4. Регистры отладки Это очень интересная группа регистров, предназначенных для аппаратной отладки. Средства аппаратной отладки впервые появились в микропроцессоре i486. Аппаратно микропроцессор содержит восемь регистров отладки, но реально из них используются только
9.3.4. Модифицируемые регистры
9.3.4. Модифицируемые регистры Если в качестве побочного эффекта инструкция модифицирует значение одного или нескольких регистров, в функции asm() должна присутствовать четвертая секция. Например, инструкция fucomip меняет регистр кода завершения, обозначаемый как cc. Строки,
2.3.11 Регистры
2.3.11 Регистры Во многих машинных архитектурах можно обращаться к (небольшим) объектам заметно быстрее, когда они помещены в регистр. В идеальном случае компилятор будет сам определять оптимальную стратегию использования всех регистров, доступных на машине, для которой
39.
Пользовательские регистры39. Пользовательские регистры Как следует из названия, пользовательскими регистры называются потому, что программист может использовать их при написании своих программ. К этим регистрам относятся:1) восемь 32-битных регистров, которые могут использоваться
40. Регистры общего назначения
40. Регистры общего назначения Все регистры этой группы позволяют обращаться к своим «младшим» частям. Использовать для самостоятельной адресации можно только младшие 16– и 8-битные части этих регистров. Старшие 16 бит этих регистров как самостоятельные объекты
41. Сегментные регистры
41. Сегментные регистры В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs.Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор
42. Регистры состояния и управления
42. Регистры состояния и управления В микропроцессор включены несколько регистров, которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:1) регистр
43. Системные регистры микропроцессора
43. Системные регистры микропроцессора Само название этих регистров говорит о том, что они выполняют специфические функции в системе. Использование системных регистров жестко регламентировано. Именно они обеспечивают работу защищенного режима. Их также можно
44. Регистры управления
44. Регистры управления В группу регистров управления входят четыре регистра: cr0, cr1, cr2, cr3. Эти регистры предназначены для общего управления системой. Регистры управления доступны только программам с уровнем привилегий 0.Хотя микропроцессор имеет четыре регистра
45. Регистры системных адресов
45. Регистры системных адресов Эти регистры еще называют регистрами управления памятью.Они предназначены для защиты программ и данных в мультизадачном режиме работы микропроцессора. При работе в защищенном режиме микропроцессора адресное пространство делится
46. Регистры отладки
46. Регистры отладки Это очень интересная группа регистров, предназначенных для аппаратной отладки. Средства аппаратной отладки впервые появились в микропроцессоре i486. Аппаратно микропроцессор содержит восемь регистров отладки, но реально из них используются только
Учебные материалы по математике | Системное программирование на ассемблер
Системное программирование
Задание 1
Текст задания
Задание 1. 1. Используя командные файлы, подготовьте к выполнению и запустите программы из примеров 1, 2 и 3. Убедитесь, что они выводят на экран нужный текст и успешно завершаются.
Задание 1.2. Заполните таблицы трассировки для программ вывода строки на экран из примеров 1, 2 и 3.
Таблица трассировки программы
Шаг | Машинный код | Команда | Регистры | Флаги | ||||||||
AX | BX | CX | DX | SP | DS | SS | CS | IP | CZSOPAID | |||
1 | ||||||||||||
2 | ||||||||||||
Пример 1
Текст программы
stak segment stack ‘stack’ ;Начало сегмента стека
db 256 dup (?) ;Резервируем 256 байт для стека
stak ends ;Конец сегмента стека
data segment ‘data’ ;Начало сегмента данных
Hello db ‘Hello, World!$’ ;Строка для вывода
data ends ;Конец сегмента данных
code segment ‘code’ ;Начало сегмента кода
assume CS:code, DS:data, SS:stak ;Сегментный регистр CS будет ;указывать на сегмент команд,
;регистр DS — на сегмент данных, ;SS – на стек
start: ;Точка входа в программу start
;Обязательная инициализация регистра DS в начале программы
mov AX, data ;Адрес сегмента данных сначала ;загрузим в AX,
mov DS, AX ;а затем перенесем из AX в DS
mov AH,09h ;Функция DOS 9h вывода на экран
mov DX, offset Hello ;Адрес начала строки ‘Hello, ;World!’ записывается в регистр DX
int 21h ;Вызов функции DOS
mov AX,4C00h ;Функция 4Ch завершения ;программы с кодом возврата 0
int 21h ;Вызов функции DOS
code ends ;Конец сегмента кода
end start ;Конец текста программы с точкой ;входа
Текст командного файла
cls
tasm. exe task1.asm
tlink. exe /x task1.obj
task1
Таблица трассировки
Шаг | Машинный код | Команда | Регистры | Флаги | ||||||||
AX | BX | CX | DX | SP | DS | SS | CS | IP | CZSOPAID | |||
0000 | 0000 | 0000 | 0000 | 0100 | 489D | 48AD | 48BE | 0000 | 00000010 | |||
1 | B8BD45 | mov ax, 48BD | 48BD | 0000 | 0000 | 0000 | 0100 | 489D | 48AD | 48BE | 0003 | 00000010 |
2 | 8ED8 | mov ds, ax | 48BD | 0000 | 0000 | 0000 | 0100 | 48BD | 48AD | 48BE | 0005 | 00000010 |
3 | B409 | mov ah, 09 | 09BD | 0000 | 0000 | 0000 | 0100 | 48BD | 48AD | 48BE | 0007 | 00000010 |
4 | BA0000 | mov dx, 0000 | 09BD | 0000 | 0000 | 0000 | 0100 | 48BD | 48AD | 48BE | 000A | 00000010 |
5 | CD21 | int 21 | 09BD | 0000 | 0000 | 0000 | 0100 | 48BD | 48AD | 48BE | 000C | 00000010 |
6 | B8004C | mov ax, 4C00 | 4C00 | 0000 | 0000 | 0000 | 0100 | 48BD | 48AD | 48BE | 000F | 00000010 |
7 | CD21 | int 21 | 0192 | 000B | F711 | 098D | 0106 | 2110 | 0192 | 0000 | 0000 | 10100011 |
Пример 2
Текст программы
. model small ;Модель памяти SMALL использует ;сегменты
;размером не более 64Кб
.stack 100h ;Сегмент стека размером 100h (256 ;байт)
.data ;Начало сегмента данных
Hello db ‘Hello, World!$’
.code ;Начало сегмента кода
start: ;Точка входа в программу start
;Предопределенная метка @data ;обозначает
;адрес сегмента данных в момент ;запуска программы,
mov AX, @data ;который сначала загрузим в AX,
mov DS, AX ;а затем перенесем из AX в DS
mov AH,09h
mov DX, offset Hello
int 21h
mov AX,4C00h
int 21h
end start
Текст командного файла
cls
tasm. exe task2.asm
tlink. exe /x task2.obj
task2
Таблица трассировки
Шаг | Машинный код | Команда | Регистры | Флаги | ||||||||
AX | BX | CX | DX | SP | DS | SS | CS | IP | CZSOPAID | |||
0000 | 0000 | 0000 | 0000 | 0100 | 489D | 48B0 | 48AD | 0000 | 00000010 | |||
1 | B8AF48 | mov ax, 48AF | 48AF | 0000 | 0000 | 0000 | 0100 | 489D | 48B0 | 48AD | 0003 | 00000010 |
2 | 8ED8 | mov ds, ax | 48AF | 0000 | 0000 | 0000 | 0100 | 48AF | 48B0 | 48AD | 0005 | 00000010 |
3 | B409 | mov ah, 09 | 09AF | 0000 | 0000 | 0000 | 0100 | 48AF | 48B0 | 48AD | 0007 | 00000010 |
4 | BA0000 | mov dx, 0000 | 09AF | 0000 | 0000 | 0000 | 0100 | 48AF | 48B0 | 48AD | 000A | 00000010 |
5 | CD21 | int 21 | 09AF | 0000 | 0000 | 0000 | 0100 | 48AF | 48B0 | 48AD | 000C | 00000010 |
6 | B8004C | mov ax, 4C00 | 4C00 | 0000 | 0000 | 0000 | 0100 | 48AF | 48B0 | 48AD | 000F | 00000010 |
7 | CD21 | int 21 | 0192 | 000B | F711 | 098D | 0106 | 2110 | 0192 | 0000 | 0000 | 10100011 |
Пример 3
Текст программы
. model tiny ;Модель памяти TINY, в которой код, ;данные и стек
;размещаются в одном и том же сегменте ;размером до 64Кб
.code ;Начало сегмента кода
org 100h ;Устанавливает значение программного ;счетчика в 100h
;Начало необходимое для COM-программы,
;которая загружается в память с адреса ;PSP:100h
start:
mov AH,09h
mov DX, offset Hello
int 21h
mov AX,4C00h
int 21h
;===== Data =====
Hello db ‘Hello, World!$’
end start
Текст командного файла
cls
tasm. exe task3.asm
tlink. exe /x /t task3.obj
task3
Таблица трассировки
Шаг | Машинный код | Команда | Регистры | Флаги | ||||||||
AX | BX | CX | DX | SP | DS | SS | CS | IP | CZSOPAID | |||
0000 | 0000 | 0000 | 0000 | FFFE | 489D | 489D | 489D | 0100 | 00000010 | |||
1 | B409 | mov ah, 09 | 0900 | 0000 | 0000 | 0000 | FFFE | 489D | 489D | 489D | 0102 | 00000010 |
2 | BA0C01 | mov dx, 010C | 0900 | 0000 | 0000 | 010C | FFFE | 489D | 489D | 489D | 0105 | 00000010 |
3 | CD21 | int 21 | 0900 | 0000 | 0000 | 010C | FFFE | 489D | 489D | 489D | 0107 | 00000010 |
4 | B8004C | mov ax, 4C00 | 4C00 | 0000 | 0000 | 010C | FFFE | 489D | 489D | 489D | 010A | 00000010 |
5 | CD21 | int 21 | 0192 | 000B | F711 | 098D | 0106 | 2110 | 0192 | 0000 | 0000 | 10100011 |
Контрольные вопросы
1. Запустите под управлением отладчика программу из примера 1. Как располагаются сегменты программы в памяти? Сопоставьте полученные данные с соответствующими размерами сегментов из листинга трансляции.
Ответ: CS – сегмент команд, DS – сегмент данных, SS – сегмент стека. CS = 48BEh, DS = 489Dh, SS = 48ADh
2. Что такое сегментный (базовый) адрес?
Ответ: Адрес ячейки памяти. Находится по формуле: база сегмента + смещение.
3. Почему перед началом выполнения программы из примера 1 содержимое регистра DS в точности на 10h меньше содержимого регистра SS?
Ответ: Адрес начала сегмента всегда кратен 16-ти (каждый сегмент должен начинаться на границе параграфа).
4. Почему в программе из примера 1 первая команда mov AX, data, начинающаяся с байта 0000 сегмента команд, занимает 3 байта? Какая еще команда занимает 3 байта?
Ответ: Так как здесь используется прямая адресация. Ещё 3 байта занимает команда mov dx, 0000.
5. Чему равен сегментный адрес сегмента команд программы из примера 2? Почему?
Ответ: 48ADh, так как используется модель памяти small.
6. Сравните содержимое регистра SP в программах из примера 2 и примера 3. Объясните, как получены эти значения.
Ответ: Во 2-м примере SP = 0100h, так как используется модель памяти small и стек располагается в первых 256 байтах сегмента памяти, а в 3-м – FFFEh, так как используется модель памяти tiny и сегменты кода, данных и стека находятся в одном сегменте размером 64 Кб.
7. Какие операторы называют директивами ассемблера? Приведите примеры директив.
Ответ: Директивы – это параметры, указывающие программе ассемблеру, каким образом следует объединять инструкции для создания модуля, который станет работающей программой. Примеры: ASSUME, SEGMENT.
8. Зачем в последнем предложении end указывают метку, помечающую первую команду программы?
Ответ: Для того, чтобы программа ассемблер поняла какая из подпрограмм закончена.
9. Как числа размером в слово хранятся в памяти и как они заносятся в 2-ух байтовые регистры?
Ответ: Они хранятся в памяти как шестнадцатеричное число и записываются справа налево. При занесении их в 2-х байтовые регистры байты меняются местами.
10.Как инициализируются в программе выводимые на экран текстовые строки?
Ответ: Сначала строка заносится в память также как и обычное число, а затем строка выводится на экран.
11.Что нужно сделать, чтобы обратиться к DOS для вывода строки на экран? Как DOS определит, где строка закончилась?
Ответ: Использовать оператор int 21h. В конец строки всегда добавляется символ $.
12.Программы, которые должны исполняться как. EXE и. COM, имеют существенные различия по:
o размеру,
o сегментной структуре,
o механизму инициализации.
Охарактеризуйте каждый из перечисленных пунктов.
Ответ: COM программы занимают меньше места в памяти и быстрее загружаются. В COM программах префикс программного сегмента, код программы, инициализированные данные и стек располагаются в одном сегменте. При запуске такой программы в начале строится PSP, занимающий 256 байт, далее располагается содержимое программы. Указатель стека устанавливается на конец сегмента.
EXE программы содержат сегменты кода, данных и стека. EXE файл загружается, начиная с адреса PSP:0100h. В процессе загрузки считывается информация EXE-заголовка в начале файла, при помощи которого загрузчик настраивает ссылки на сегменты в загруженном модуле, так как программа загружается в произвольный сегмент. После настройки ссылок управление передается загрузочному модулю к адресу CS:IP, извлеченному из заголовка EXE.
x86 — Сборка: использование регистра сегментов данных (DS)
Задавать вопрос
спросил
Изменено 6 лет, 9 месяцев назад
Просмотрено 33 тысячи раз
Часть коллектива Intel
В настоящее время я изучаю ассемблер x86 для развлечения, я люблю программирование микроконтроллеров, поэтому я знаком с ассемблером.
В настоящее время я ищу ответ на этот вопрос повсюду, но не могу его найти… регистр DS, я знаю, что он должен указывать на глобальные данные в моей программе, но я не знаю не знаю, как это работает точно. Я использую NASM и в большинстве простых программ вижу следующее:
[орг 0x7C00] [бит 16] главный: топор, 0x0000 мов дс, топор mov al, [msg] мов ах, 0x0E мов бх, 0x0007 интервал 0x10 jmp $ сообщение БД 'X' раз 510-($-$$) дб 0 дв 0xAA55
и это прекрасно работает (даже если я опускаю код, выделенный жирным шрифтом), но как? Загружает ли ЦП автоматически глобальные переменные, начиная с 0x0000? или здесь есть что-то внутреннее, что мне не хватает?
- сборка
- x86
- процессор-регистры
- сегмент
1
Когда компьютер находится в реальном режиме (режим, в котором ЦП находится, когда BIOS запускает загрузчик), метод, который ЦП использует для вычисления адреса, очень прост: умножьте значение сегментного регистра на 16 (сдвиньте биты на 4 позиции влево) , затем добавьте смещение.
Например, в такой инструкции, как «mov ax, [0x1234]», ЦП будет использовать «DS * 0x10 + 0x1234» в качестве эффективного адреса (в вашем случае первый член разрешается равным нулю). ax, [BP+0x32]», то ЦП будет использовать «SS * 0x10 + BP + 0x32». Обратите внимание, что теперь ЦП использует другой регистр сегмента (сегмент стека), потому что, когда используется регистр BP, ЦП предполагает, что вы не хотите обращаться к стеку по умолчанию (но вы можете переопределить это, используя [DS :BP + 0x32]).
Более или менее то, что я объяснил, и многое другое можно найти на http://wiki.osdev.org/Real_Mode и http://www.internals.com/articles/protmode/realmode.htm и во многих других местах. .
Кстати, «msg» должен располагаться примерно по адресу 0x7C11.
1
Зарегистрируйтесь или войдите
Зарегистрироваться через Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Как получить премиальную учетную запись для входа в DS онлайн
Premium DS Logon – это безопасные идентификационные данные, которые ветераны и военнослужащие могут использовать для входа на сайты VA. gov, My HealtheVet и другие веб-сайты с одним именем пользователя и паролем. Читайте ниже, чтобы узнать, как зарегистрироваться в Интернете для получения учетной записи Premium DS Logon .
- Проверьте свою регистрацию в DEERS в DS Logon
Пошаговая инструкция
Убедитесь, что вы зарегистрированы в Системе отчетности о правах на участие в программе защиты (DEERS)
Это база данных, в которой записаны все люди, имеющие право на военные льготы.
- Если вы являетесь ветераном или военнослужащим или квалифицированным опекуном семьи, оставшимся в живых или иждивенцем ветерана или военнослужащего, служившего после 19 лет82, вы уже должны быть зарегистрированы в DEERS.
- Если вы являетесь ветераном или квалифицированным опекуном, оставшимся в живых или иждивенцем ветерана, служившего до 1982 года, , вы не можете быть зачислены. Чтобы зарегистрироваться, позвоните нам по телефону 800-827-1000 и выберите «Вариант 7». Сообщите оператору, что хотите зарегистрироваться в DEERS, и попросите его отправить вам электронное письмо с подтверждением завершения регистрации.
Зарегистрируйте свою базовую учетную запись DS Logon в Интернете
Перейдите на веб-сайт самообслуживания DS Logon и нажмите кнопку Дополнительные параметры входа DS . Из появившихся вариантов выберите Требуется вход в службу DS?
Вам будет предложено выбрать способ регистрации:
- Если у вас есть общая карта доступа (CAC) с доступным устройством чтения карт, выберите этот вариант. Это самый простой способ получить DS Logon 9.0072 и немедленно перейдите на премиум-аккаунт.
- Если у вас есть учетная запись myPay в Defense Finance and Account Service (DFAS), , вы можете выбрать этот вариант. Вы сможете сразу перейти на премиум-аккаунт.
- Если у вас нет учетной записи CAC или DFAS myPay, выберите Ни одно из вышеперечисленных условий не применяется вариант.
Примечание: Вы также можете перейти на учетную запись Premium DS Logon лично или по телефону, если не хотите регистрироваться онлайн.
Узнайте, как получить Premium DS Logon лично или по телефонуОбновление до Премиум-аккаунта
Инструмент регистрации проведет вас через процесс регистрации вашей учетной записи и предложит вам перейти на учетную запись Premium через онлайн-процесс. В ходе этого процесса вам будет задан ряд вопросов, чтобы доказать, что вы — это вы, а не кто-то, кто притворяется вами, — чтобы помочь защитить личную информацию, к которой у вас будет доступ с помощью учетной записи Premium.
Перейти на веб-сайт самообслуживания DS Logon
- Проверьте свою регистрацию в DEERS в DS Logon
Часто задаваемые вопросы о входе в службу DS
Вход в систему VA.gov
Подтверждение вашей личности на VA.