Что такое сегмент данных в ассемблере

Директивы сегмантации в ассемблере

Физически сегмент представляет собой область памяти, занятую командами и (или) данными, адреса которых вычисляются относительно значения в соответствующем сегментном регистре.

Каждая программа содержит 3 типа сегментов:

Функциональное назначение сегмента несколько шире, чем простое разбиение программы на блоки кода, данных и стека. Сегментация является частью более общего механизма, связанного с концепцией модульного программирования. Она предполагает унификацию оформления объектных модулей, создаваемых компилятором, в том числе с разных языков программирования. Это позволяет объединять программы, написанные на разных языках. Именно для реализации различных вариантов такого объединения и предназначены директивы сегментации.

Упрощенные директивы сегментации

Для задания сегментов в тексте программы можно пользоваться упрощенными директивами:

Однако использование упрощенных директив сегментации не позволяет создать более трех сегментов для одной программы.

Стандартные директивы сегментации

Директива ENDS определяет конец сегмента.

Атрибут выравнивания сегмента (тип выравнивания) align сообщает компоновщику о том, что нужно обеспечить размещение начала сегмента на заданной границе. Это важно, поскольку при правильном выравнивании доступ к данным в процессорах, совместимых с базовым i8086, выполняется быстрее. Допустимые значения этого атрибута следующие:

Атрибут класса сегмента (тип класса) ‘class’ — это заключенная в кавычки строка, помогающая компоновщику определить соответствующий порядок следования сегментов при сборке программы из сегментов нескольких модулей. Компоновщик объединяет вместе в памяти все сегменты с одним и тем же именем класса (имя класса, в общем случае, может быть любым, но лучше, если оно будет отражать функциональное назначение сегмента). Типичным примером использования имени класса является объединение в группу всех сегментов кода программы (обычно для этого используется класс ‘code’ ). С помощью механизма типизации класса можно группировать также сегменты инициализированных и неинициализированных данных.

Источник

Упрощенный формат директивы MODEL

MODEL [ ] [др. параметры]

Обязательным параметром директивы MODEL является «модель памяти». Этот параметр определяет модель сегментации памяти для программного модуля.

Возможные значения параметра «модель памяти»:

Параметр «модификатор» директивы MODEL уточняет особенности использования выбранной модели памяти.

Возможные значения параметра «модификатор модели памяти»:

Другие параметры используются при написании программ на разных языках программирования (пока использовать не будем).

Для большинства программ на ассемблере используют директиву

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

Перечислим идентификаторы, создаваемые директивой MODEL:

Структура программы на языке Assembler

Таким образом, общая структура программы может выглядеть следующим образом:

masm ;режим работы TASM: ideal или masm

model small ;модель памяти

.stack ;сегмент стека

.data ;сегмент данных

end BEGIN ;конец программы с точкой входа BEGIN

Текст программы с использованием упрощенных директив сегментации.

Описаны 3 сегмента программы: сегмент данных, сегмент стека и сегмент кода.

В сегменте данных задана строка для вывода на экран.

Размер стека равен 256 байт.

Сегмент кода содержит команды начала и завершения программы, а также комментарии к пропущенным командам.

masm ;режим работы TASM: ideal или masm

model small ;модель памяти

.data ;сегмент данных

message db ‘Привет всем,$’

.stack ;сегмент стека

db 256 dup (‘?’) ;сегмент стека

main : ;начало программы

mov ax,@data ;заносим в сегментный регистр ds

mov ds,ax ; физический адрес сегмента данных

;здесь будут команды вывода строки на экран

mov ax,4c00h ;пересылка 4c00h в регистр ax

int 21h ;вызов прерывания с номером 21h

end main ;конец программы с точкой входа main

Источник

Что такое сегмент данных в ассемблере

Справочная система по языку Assembler

Структура программы на ассемблере


Синтаксис ассемблера

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 1. Формат предложения ассемблера

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 2. Формат директив

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 3. Формат команд и макрокоманд

Практически каждое предложение содержит описание объекта, над которым или при помощи которого выполняется некоторое действие. Эти объекты называются операндами.
Их можно определить так:
операнды — это объекты (некоторые значения, регистры или ячейки памяти), на которые действуют инструкции или директивы, либо это объекты, которые определяют или уточняют действие инструкций или директив.

Операнды могут комбинироваться с арифметическими, логическими, побитовыми и атрибутивными операторами для расчета некоторого значения или определения ячейки памяти, на которую будет воздействовать данная команда или директива.

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 4. Синтаксис описания адресных операндов

Результатом вычисления выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное) значение.

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 7. Синтаксис операторов сравнения

Таблица 1. Операторы сравнения

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 9. Синтаксис индексного оператора

Заметим, что в литературе по ассемблеру принято следующее обозначение: когда в тексте речь идет о содержимом регистра, то его название берут в круглые скобки. Мы также будем придерживаться этого обозначения.
К примеру, в нашем случае запись в комментариях последнего фрагмента программы mas + (si) означает вычисление следующего выражения: значение смещения символического имени mas плюс содержимое регистра si.

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 13. Синтаксис оператора получения смещения

Как и в языках высокого уровня, выполнение операторов ассемблера при вычислении выражений осуществляется в соответствии с их приоритетами (см. табл. 2). Операции с одинаковыми приоритетами выполняются последовательно слева направо. Изменение порядка выполнения возможно путем расстановки круглых скобок, которые имеют наивысший приоритет.

Таблица 2. Операторы и их приоритет

Директивы сегментации

Синтаксическое описание сегмента на ассемблере представляет собой конструкцию, изображенную на рис. 14:

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 14. Синтаксис описания сегмента

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 15. Директива ASSUME

На уроке 3 мы рассматривали пример программы с директивами сегментации. Эти директивы изначально использовались для оформления программы в трансляторах MASM и TASM. Поэтому их называют стандартными директивами сегментации.

В листинге 1 приведен пример программы с использованием упрощенных директив сегментации:
Синтаксис директивы MODEL показан на рис. 16.

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Рис. 16. Синтаксис директивы MODEL

Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упомянутыми нами ранее упрощенными директивами описания сегментов. Эти директивы приведены в табл. 3.

Таблица 3. Упрощенные директивы определения сегмента

Формат директивы
(режим MASM)
Формат директивы
(режим IDEAL)
Назначение
.CODE [имя]CODESEG[имя]Начало или продолжение сегмента кода
.DATADATASEGНачало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near
.CONSTCONSTНачало или продолжение сегмента постоянных данных (констант) модуля
.DATA?UDATASEGНачало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа near
.STACK [размер]STACK [размер]Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека
.FARDATA [имя]FARDATA [имя]Начало или продолжение сегмента инициализированных данных типа far
.FARDATA? [имя]UFARDATA [имя]Начало или продолжение сегмента неинициализированных данных типа far
Наличие в некоторых директивах параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечить совместимость с некоторыми компиляторами языков высокого уровня, которые создают разные сегменты данных для инициализированных и неинициализированных данных, а также констант.

При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти (см. табл. 5). Перечислим эти идентификаторы и их значения (табл. 4).

Таблица 4. Идентификаторы, создаваемые директивой MODEL

Имя идентификатораЗначение переменной
@codeФизический адрес сегмента кода
@dataФизический адрес сегмента данных типа near
@fardataФизический адрес сегмента данных типа far
@fardata?Физический адрес сегмента неинициализированных данных типа far
@cursegФизический адрес сегмента неинициализированных данных типа far
@stackФизический адрес сегмента стека
Если вы посмотрите на текст листинга 1, то увидите пример использования одного из этих идентификаторов. Это @data ; с его помощью мы получили значение физического адреса сегмента данных нашей программы.

Таблица 5. Модели памяти

Таблица 6. Модификаторы модели памяти

Значение модификатораНазначение
use16Сегменты выбранной модели используются как 16-битные (если соответствующей директивой указан процессор i80386 или i80486)
use32Сегменты выбранной модели используются как 32-битные (если соответствующей директивой указан процессор i80386 или i80486)
dosПрограмма будет работать в MS-DOS
Необязательные параметры язык и модификатор языка определяют некоторые особенности вызова процедур. Необходимость в использовании этих параметров появляется при написании и связывании программ на различных языках программирования.

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

Упрощенные директивы целесообразно использовать для простых программ и программ, предназначенных для связывания с программными модулями, написанными на языках высокого уровня. Это позволяет компоновщику эффективно связывать модули разных языков за счет стандартизации связей и управления.

Источник

Назначение сегмента данных

Сегмент данных предназначен для определения (описания) данных программы: констант, переменных и областей ввода-вывода.

Загрузка базового адреса сегмента данных в регистр DS должна быть выполнена в программе до того, как произойдет первое обращение к данным.

Обычно инициализация сегмента DS производится следующими командами:

Описание простых типов данных (описание переменных)

Для описания простых типов данных в программе предназначены директивы резервирования и инициализации данных.

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

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

Директивы резервирования и инициализации данных простых типов:

db — резервирование памяти для данных размером 1 байт.

dw — резервирование памяти для данных размером 2 байта.

dd — резервирование памяти для данных размером 4 байта.

df — резервирование памяти для данных размером 6 байт;

dp — резервирование памяти для данных размером 6 байт.

dq — резервирование памяти для данных размером 8 байт.

dt — резервирование памяти для данных размером 10 байт.

Формат этих директив:

«Выражение» может быть

2) Последовательностью констант

Massiv dw 0,0,0,0,0 ; 5 элементов, каждый по 2 байта

3) Цепочкой символов, заключенных в кавычки

Пример

4) Символическим именем (из поля этой или другой директивы)

Когда транслятор встречает такую директиву резервирования памяти, он формирует в памяти значение адреса переменной, имя которой указано в качестве операнда.

— либо только смещение (директива dw) размером 2 байта.

perem dd 0f54d567ah

adr dw perem ;в adr записано смещение perem

adr_full dd perem ; в adr_full записан полный

;физический адрес perem (и адрес сегмента, и смещение)

Пример

Вопросительный знак означает резервирование памяти без инициализации (присвоения начального значения).

Пример

Massiv 1 dw 5 DUP (0) ;массив из пяти 0

Massiv 2 db 10 DUP (0),10 DUP (1) ;массив из 10 «0» и 10 «1»

Massiv 3 db 3 DUP (0),1,1 ;массив из трех «0» и двух «1»

Massiv 4 db 100 DUP (?) ;массив из 100 неопределенных значений

Stroka db 10 DUP (‘ ‘) ;строка из 10 пробелов

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

Рассмотрим, как на языке Assembler задаются константы.

Описание констант

Однако иногда их называют директивами определения идентификаторов или соответственно директивами эквивалентности и присваивания.

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

В ходе трансляции вместо имен макроассемблер подставит соответствующие значения.

Этот псевдооператор аналогичен описанию константы в языке Pascal :

Обратим внимание на отличия псевдооператоров.

1. С помощью EQU символическому имени (константе) можно поставить в соответствие как числовые выражения, так и текстовые строки, а псевдооператор = может использоваться только с числовыми выражениями.

ak equ ax ; можно переименовать регистр

Совет. Псевдооператор = удобно использовать для определения простых абсолютных (т.е. не зависящих от места загрузки программы в память) математических выражений.

Источник

Структура программы на языке ассемблера


Глава из книги “Ассемблер для процессоров Intel Pentium”


Автор: Ю. Магда
Источник: Ассемблер для процессоров Intel Pentium
Материал предоставил: Издательство «Питер»

Опубликовано: 08.04.2006
Версия текста: 1.0

Что такое сегмент данных в ассемблере. Смотреть фото Что такое сегмент данных в ассемблере. Смотреть картинку Что такое сегмент данных в ассемблере. Картинка про Что такое сегмент данных в ассемблере. Фото Что такое сегмент данных в ассемблере

Материал этой главы посвящен вопросам организации и компоновки программного кода на языке ассемблера. Затронуты вопросы взаимодействия различных частей ассемблерной программы, организации сегментов программного кода, данных и стека в контексте различных моделей памяти. Напомню, что мы рассматриваем эти аспекты применительно к макроассемблеру MASM фирмы Microsoft, хотя многие положения действительны и для других компиляторов. Начнем с анализа сегментов. Мы уже сталкивались с этими вопросами в главе 3, сейчас же рассмотрим их более детально.

4.1. Организация сегментов

Для хорошего понимания, как работает программа на ассемблере, нужно очень четко представлять себе организацию сегментов. Применительно к процессорам Intel Pentium термин “сегмент” имеет два значения:

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

При использовании 32-разрядного защищенного режима эти проблемы исчезают. Например, в плоской модели памяти (о ней мы поговорим чуть позже) для адресации программного кода и данных достаточно 32-разрядного эффективного адреса внутри непрерывной области памяти.

Логические сегменты могут содержать три основных компонента программы: программный код, данные и стек. Макроассемблер MASM обеспечивает правильное отображение этих компонентов на физические сегменты памяти, при этом сегментные регистры CS, DS и SS содержат адреса физических сегментов памяти.

4.2. Директивы управления сегментами и моделями памяти макроассемблера MASM

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

Модель памятиАдресация кодаАдресация данныхОперационная системаЧередование кода и данных
TINYNEARNEARMS-DOSДопустимо
SMALLNEARNEARMS-DOS, WindowsНет
MEDIUMFARNEARMS-DOS, WindowsНет
COMPACTNEARFARMS-DOS, WindowsНет
LARGEFARFARMS-DOS, WindowsНет
HUGEFARFARMS-DOS, WindowsНет
FLATNEARNEARWindows NT, Windows 2000, Windows XP, Windows 2003Допустимо
Таблица 4.1. Параметры моделей памяти

Все семь моделей памяти поддерживаются всеми компиляторами MASM, начиная с версии 6.1.

Модель small поддерживает один сегмент кода и один сегмент данных. Данные и код при использовании этой модели адресуются как near (ближние). Модель large поддерживает несколько сегментов кода и несколько сегментов данных. По умолчанию все ссылки на код и данные считаются дальними (far).

Модель medium поддерживает несколько сегментов программного кода и один сегмент данных, при этом все ссылки в сегментах программного кода по умолчанию считаются дальними (far), а ссылки в сегменте данных — ближними (near). Модель compact поддерживает несколько сегментов данных, в которых используется дальняя адресация данных (far), и один сегмент кода с ближней адресацией (near). Модель huge практически эквивалентна модели памяти large.

Должен заметить, что разработчик программ может явно определить тип адресации данных и команд в различных моделях памяти. Например, ссылки на команды внутри одного сегмента кода в модели large можно сделать ближними (near). Проанализируем, в каких случаях лучше всего подходят те или иные модели памяти.

Модель tiny работает только в 16-разрядных приложениях MS-DOS. В этой модели все данные и код располагаются в одном физическом сегменте. Размер программного файла в этом случае не превышает 64 Кбайт. С другой стороны, модель flat предполагает несегментированную конфигурацию программы и используется только в 32-разрядных операционных системах. Эта модель подобна модели tiny в том смысле, что данные и код размещены в одном сегменте, только 32-разрядном. Хочу напомнить, что многие примеры из этой книги разработаны именно для модели flat.

Параметр соглашение_о_вызовах используется для определения способа передачи параметров при вызове процедуры из других языков, в том числе и языков высокого уровня (C++, Pascal). Параметр может принимать следующие значения: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL. При разработке модулей на ассемблере, которые будут применяться в программах, написанных на языках высокого уровня, обращайте внимание на то, какие соглашения о вызовах поддерживает тот или иной язык. Более подробно соглашения о вызовах мы будем рассматривать при анализе интерфейса программ на ассемблере с программами на языках высокого уровня.

Параметр тип_ОС равен OS_DOS, и на данный момент это единственное поддерживаемое значение этого параметра.

Здесь параметр flat указывает компилятору на то, что будет использоваться 32-разрядная линейная адресация. Второй параметр c указывает, что при вызове ассемблерной процедуры из другой программы (возможно, написанной на другом языке) будет задействован способ передачи параметров, принятый в языке C. Следующий пример:

Здесь используются модель памяти large, соглашение о передаче параметров языка C и отдельный сегмент стека (регистр SS не равен DS).

В этом примере используются модель medium, соглашение о передаче параметров для Pascal и область стека, размещенная в одном физическом сегменте с данными.

4.3. Структура программ на ассемблере MASM

В следующем примере показана 16-разрядная программа на ассемблере, в которой используются упрощенные директивы ассемблера MASM:

Здесь оператор end main указывает на точку входа main в главную процедуру. Оператор end закрывает последний сегмент и обозначает конец исходного текста программы. В 16-разрядных приложениях MS-DOS можно инициализировать сегментные регистры так, чтобы они указывали на требуемый логический сегмент данных. Листинг 4.1 демонстрирует это.

Затем строка s1, адресуемая через регистры DS:DX, выводится на экран с использованием прерывания 9h функции 21h MS-DOS. Попробуйте закомментировать проанализированные две строки кода и посмотреть на результат работы программы.

Для 32-разрядных приложений шаблон исходного текста выглядит иначе:

Основное отличие от предыдущего примера — другая модель памяти (flat), предполагающая 32-разрядную линейную адресацию с атрибутом near.

Замечу, что директива SEGMENT может применяться с любой моделью памяти, не только flat. При использовании директивы SEGMENT потребуется указать компилятору на то, что все сегментные регистры устанавливаются в соответствии с моделью памяти flat. Это можно сделать при помощи директивы ASSUME:

Регистры FS и GS программами не используются, поэтому для них указывается атрибут ERROR.

Сейчас мы рассмотрим программный код 32-разрядной процедуры на ассемблере (она называется _seg_ex), в которой используются два логических сегмента данных. Процедура выполняет копирование строки src, находящейся в сегменте данных data1, в область памяти dst в сегменте данных data2 и содержит один логический сегмент программного кода (code segment).

Успокою читателей, незнакомых с принципами работы процедур (они рассмотрены далее в книге): в данном случае нас будет интересовать код внутри процедуры _seg_ex (команды, находящиеся между директивами _seg_ex proc и _seg_ex endp). Исходный текст программного кода процедуры _seg_ex представлен в листинге 4.2.

При использовании модели flat доступ к данным осуществляется по 32-разрядному смещению, поэтому смысл показанных ниже команд, загружающих адреса логических сегментов (а заодно и адреса строк src и dst) в регистры ESI и EDI, думаю, понятен:

Группа следующих команд выполняет копирование строки src в dst, при этом регистр CX содержит количество копируемых байтов:

Здесь процедура seg_ex является внешней, поэтому объявлена как extern.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *