Ptr assembler что это

Основы Ассемблера

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

Комментарии в ваших программах оставляются после точки с запятой. Точно также как в дельфи или си через //.

Числа в ассемблере могут представляться в двоичной, десятеричной или шестнадцатеричной системе. Для того, чтобы показать в какой системе использовано число надо поставить после числа букву. Для бинарной системы пишется буква b (пример: 0000010b, 001011010b), для десятеричной системы можно ничего не указывать после числа или указать букву d (примеры: 4589, 2356d), для шестнадцатеричной системы надо указывать букву h, шестнадцатеричное число надо обязательно писать с нулём в начале (примеры: 00889h, 0AC45h, 056Fh, неправильно F145Ch, С123h).

Самая первая команда будет хорошо всем известная MOV. Эта команда используется для копирования (не обращайте внимания на имя команды) значения из одного места в другое. Это ‘место’ может быть регистр, ячейка памяти или непосредственное значение (только как исходное значение). Синтаксис команды:

Вы можете копировать значение из одного регистра в другой.

Вышеприведенная команда копирует содержание ecx в edx. Размер источника и приемника должны быть одинаковыми,

Этот опкод пытается поместить DWORD (32-битное) значение в байт (8 битов). Это не может быть сделано mov командой (для этого есть другие команды).

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

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

смещение3435363738393A3B3C3D3E3F404142
данные0D0A50324457257A5E72EF7DFFADC7

(Каждый блок представляет байт)

Вернемся к примеру выше. Вы также можете это делать и с другими размерами:

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

Иногда размер можно не указывать:

Можно также непосредственные значения:

Эта команда просто запишет в регистр edx, значение 5006. Скобки, [ и ], используются, для получения значения из памяти (в скобках находится смещение), без скобок, это просто непосредственное значение.

Можно также использовать регистр как ячейку памяти (он должен быть 32-разрядным в 32-разрядных программах):

В mov cx, [eax], процессор сначала смотрит, какое значение (= ячейке памяти) содержит eax, затем какое значение находится в той ячейке памяти, и помещает это значение (word, 16 бит, потому что приемник, cx, является 16-разрядным регистром) в CX.

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

Ptr assembler что это. Смотреть фото Ptr assembler что это. Смотреть картинку Ptr assembler что это. Картинка про Ptr assembler что это. Фото Ptr assembler что это

(стек здесь заполнен нулями, но в действительности это не так, как здесь). ESP стоит в том месте, на которое он указывает)

Ptr assembler что это. Смотреть фото Ptr assembler что это. Смотреть картинку Ptr assembler что это. Картинка про Ptr assembler что это. Фото Ptr assembler что это Ptr assembler что это. Смотреть фото Ptr assembler что это. Смотреть картинку Ptr assembler что это. Картинка про Ptr assembler что это. Фото Ptr assembler что это Ptr assembler что это. Смотреть фото Ptr assembler что это. Смотреть картинку Ptr assembler что это. Картинка про Ptr assembler что это. Фото Ptr assembler что это

Когда выполняется команда call, процессор передает управление на код с адреса 455659, и выполняет его до команды ret, а затем возвращает управление команде следующей за call. Код который вызывается командой call называется процедурой. Вы можете поместить код, который вы часто используете в процедуру и каждый раз когда он вам нужен вызывать его командой call.

Подробнее: команда call помещает регистр EIP (указатель на следующюю команду, которая должна быть выполнена) в стек, а команда ret извлекает его и передаёт управление этому адресу. Вы также можете определить аргументы, для вызываемой программы (процедуры). Это можно сделать через стек:

Внутри процедуры, аргументы могут быть прочитаны из стека и использованы. Локальные переменные, т.е. данные, которые необходимы только внутри процедуры, также могут быть сохранены в стеке. Я не буду подробно рассказывать об этом, потому, что это может быть легко сделано в ассемблерах MASM и TASM. Просто запомните, что вы можете делать процедуры и что они могут использовать параметры.

Одно важное замечание: регистр eax почти всегда используется для хранения результата процедуры.

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

Вот и кончился очередной урок. На следующем уроке мы напишем первую программу на ассемблере.

Источник

Что делает операция PTR

Что означает ptr в строке byte ptr[si],al
Что означает ptr в строке byte ptr,al Вот весь код, может понадобится Преобразование двоичного.

Что такое qword ptr gs
Есть инструкция jmp qword ptr gs: Каким образом мне понять куда она прыгает (конкретный.

Что означает mov byte ptr ds:[1], ‘b’?
Здравствуйте, обьясните пожалуйста фрагмент кода. mov byte ptr ds:, ‘a’ mov byte ptr.

Что за адрес в MOV EAX,DWORD PTR DS:[10008234]
Занимаюсь дизассемблированием одной софтинки в ollydbg. Встретилась такая команда MOV EAX,DWORD.

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

Добавлено через 14 минут
p.s. кстати, по поводу полученного значения в первичном примере, все равно непонятно почему 3004h. Что это, смещение в сегменте данных, указывающее на второй операнд? И какой тип определен значением 03h?

Мдя. Первоапрельский троллинг не удался.:cry:

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

и все же, как же по теме?) почему именно 3004h?

Сорри за глупый вопрос, что есть FPC? поиск на форуме ничего не дал (

Добавлено через 48 минут
в общем, в примере «$2» от «2» ничем не отличается в результате, и это точно не идентификатор переменной, поскольку вставленный впереди оператор

Добавлено через 42 минуты
странно, среди списка дизассемблеров нет отладчика OllyDbg

Добавлено через 7 минут
в отладчик не лазил, лень Ptr assembler что это. Смотреть фото Ptr assembler что это. Смотреть картинку Ptr assembler что это. Картинка про Ptr assembler что это. Фото Ptr assembler что это, видимо 3004h это адрес в сегменте данных, по которому лежат данные о типе и значении данных, я так это понял из темы, всем еще раз спасибо за участие)

значение операнда : результат:
0h : 0000h 0000 0000 0000 0000
1h : 0400h 0000 0100 0000 0000
2h : 3004h 0011 0000 0000 0100
3h : 3030h 0011 0000 0011 0000
4h : 3030h 0011 0000 0011 0000
5h : 3030h 0011 0000 0011 0000
6h : 0430h 0000 0100 0011 0000
7h : 3004h 0011 0000 0000 0100
8h : 3030h 0011 0000 0011 0000
9h : 3030h 0011 0000 0011 0000
Ah : 3130h 0011 0001 0011 0000
Bh : 0431h 0000 0100 0011 0001
Ch : 3004h 0011 0000 0000 0100
Dh : 3030h 0011 0000 0011 0000
Eh : 3130h 0011 0001 0011 0000
Fh : 3031h 0011 0000 0011 0001
вот такие интересные результаты) отмечу лишь, что их природа довольно не линейна;
мое резюме: возможно «косяк» Борланда, хотя я к ним отношусь с большим пиететом; но возможно и есть какое то объяснение, о понимании которого я чего-то не знаю.

Добавлено через 51 минуту
0! Интересный момент. Задал тип явно, с WORD вроде все понятно, результат как и раньше, но когда поставил BYTE, пришлось указать байт регистра; отрывок кода:

Источник

Ptr assembler что это

Ассемблер и программирование для IBM PC.

24.Справочник по директивам языка Ассемблер

Ц е л ь: подробно описать операторы и директивы языка Ассемблер.

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

ИНДЕКСНАЯ АДРЕСАЦИЯ ПАМЯТИ
________________________________________________________________

При прямой адресации памяти в одном из операндов команды указывается
имя определенной переменной, например для переменной COUNTER:

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

— базовый регистр BX в виде [BX] вместе с сегментным регистром
DS или базовый регистр BP в виде [BP] вместе с сегментным регистром
SS. Например, с помощью команды

MOV DX,[BX] ;Базовый регистр

в регистр DX пересылается элемент, взятый по относительному адресу в
регистре BX и абсолютному адресу сегмента в регистре DS;
— индексный регистр DI в виде [DI] или индексный регистр SI в
виде [SI], оба вместе с сегментным регистром DS. Например, с помощью
команды

MOV AX,[SI] ;Индексный регистр

в регистр AХ пересылается элемент, взятый по относительному адресу в
регистре SI и абсолютному адресу сегмента в регистре DS;
— [константу], содержащую непосредственный номер или имя в
квадратных скобках. Например, с помощью команды

MOV [BX+SI+4],AX ;База+индекс+константа

MOV DX,8[DI][4] ;Смещение+индекс+константа

в регистр DX пересылается элемент, взятый по абсолютному адресу в
регистре DS, смещению 8, относительному адресу в регистре DI и
константе 4.

Эти операнды можно комбинировать в любой последовательности. Но
нельзя использовать одновременно два базовых регистра [BX + BP] или два
индексных регистра [DI + SI]. Обычно индексированные адреса используются
для локализации элементов данных в таблицах.

ОПЕРАТОРЫ ЯЗЫКА АССЕМБЛЕР
________________________________________________________________

Существует три типа ассемблерных операторов: операторы атрибута,
операторы, возвращающие значение, и операторы. специфицирующие битовую
строку. В данном разделе рассмотрены первые два типа операторов.
Операторы, специфицирующие битовую строку, оператор MASK, счетчик сдвига и
оператор WIDTH относятся к директиве RECORD и будет рассмотрены в
следующем разделе.

Оператор LENGTH
——————
Оператор LENGTH возвращает число элементов, определенных операндом
DUP. Например, следующая команда MOV заносит в регистр DX значение 10:

TABLEA DW 10 DUP(?)
.
MOV DX,LENGTH TABLEA

Если операнд DUP отсутствует, то оператор LENGTH возвращает значение
01. См. операторы SIZE и TYPE в этом разделе.

Оператор OFFSET
——————
Оператор OFFSET возвращает относительный адрес переменной или метки
внутри сегмента данных или кода. Оператор имеет следующий формат:

OFFSET переменная или метка

MOV DX,OFFSET TABLEA

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

Оператор PTR
—————
Оператор PTR используется совместно с атрибутами типа BYTE, WORD или
DWORD для локальной отмены определенных типов (DB, DW или DD) или с
атрибутами NEAR или FAR для отмены значения дистанции по умолчанию. Формат
оператора следующий:

В поле «тип» указывается новый атрибут, например BYTE. Выражение имеет
ссылку на переменную или константу. Приведем несколько примеров оператора
PTR:

FLDB DB 22H
DB 35H
FLDW DW 2672H ;0бьектный код 7226
MOV AН,BYTE PTR FLDW ;Пересылает 1-й байт (72)
ADD BL,BYTE PTR FLDW+1 ;Прибавляет 2-й байт (26)
MOV BYTE PTR FLDW,05 ;Пересылает 05 в 1-й байт
MOV AX,WORD PTR FLDB ;3аносит в АХ байты (2235)
CALL FAR PTR[BX] ;Длинный вызов процедуры

Директива LABEL, описанная в следующем разделе, выполняет функцию,
аналогичную оператору PTR.

Оператор SEG
—————
Оператор SEG возвращает адрес сегмента, в котором расположена
указанная переменная или метка. Наиболее подходящим является использование
этого оператора в программах, состоящих из нескольких отдельно
ассемблируемых сегментов. Формат оператора:

SEG переменная или метка

Примеры применения оператора SEG в командах MOV:

MOV DX,SEG FLOW ;Адрес сегмента данных
MOV DX,SEG A20 ;Адрес сегмента кода

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

Оператор SIZE
—————
Оператор SIZE возвращает произведение длины LENGTH и типа TYPE и
полезен только при ссылках на переменную с операндом DUP. Формат
оператора:

См. пример для оператора TYPE.

Оператор TYPE
—————
Оператор TYPE возвращает число байтов, соответствующее определению
указанной переменной:

Определение Число байтов

DB 1
DW 2
DD 4
DQ 8
DT 10
STRUC Число байтов, определённых в STRUC
NEAR метка FFFF
FAR метка FFFE

Формат оператора TYPE:

TYPE переменная или метка

Ниже приведены примеры, иллюстрирующие применение операторов TYPE, LENGTH
и SIZE:

ДИРЕКТИВЫ АССЕМБЛЕРА
________________________________________________________________

В данном разделе описано большинство ассемблерных директив. В гл.5
были подробно рассмотрены директивы для определения данных (DB, DW и
проч.).

В директиве указываются имена сегментных регистров, групп (GROUP) и
выражений SEG. Одна директива ASSUME может назначить до четырех сегментных
регистров в любой последовательности, например:

Для отмены любого ранее назначенного в директиве ASSUME сегментного
регистра необходимо использовать ключевое слово NOTHING:

Если, например, регистр DS оказался не назначен или отменен ключевым
словом NOTHING, то для ссылки к элементу из сегмента данных в командах
используется операнд со ссылкой к регистру DS:

MOV AX,DS:[BX] ;Использование индексного адреса
MOV AX,DS:FLDW ;Пересылка содержимого поля FLDW

Конечно, регистр DS должен содержать правильное значение сегментного
адреса.

Директива EXTRN подробно рассмотрена в гл.21.

Следующая директива GROUP объединяет SEG1 и SEG2 в одном ассемблерном
модуле:

GROUPX GROUP SEG1,SEG2
SEG1 SEGMENT PARA ‘CODE’
ASSUME CS:GROUPX
SEG1 ENDS
SEG2 SEGMENT PARA ‘CODE’
ASSUME CS:GROUPX
SEG2 ENDS

Директива INCLUDE
——————-
Отдельные фрагменты ассемблерного кода или макрокоманды могут
использоваться в различных программах. Для этого такие фрагменты и
макрокоманды записываются в отдельные дисковые файлы, доступные для
использования из любых программ. Пусть некоторая подпрограмма,
преобразующая ASCII-код в двоичное представление, записана на диске С в
файле по имени CONVERT.LIB. Для доступа к этому файлу необходимо указать
директиву

причем в том месте исходной программы, где должна быть закодирована
подпрограмма преобразования ASCII-кода. В результате ассемблер найдет
необходимый файл на диске и вставит его содержимое в исходную программу.
(Если файл не будет найден, то ассемблер выдаст соответствующее сообщение
об ошибке и директива INCLUDE будет игнорирована.)
Для каждой вставленной строки ассемблер выводит в LST-файл в 30-й
колонке символ С (исходный текст в LST-файле начинается с 33-й колонки).
В гл.20 (Макрокоманды) дан практический пример директивы INCLUDE и
дано объяснение, каким образом можно использовать эту директиву только в
первом проходе ассемблера.

Директива LABEL
——————
Директива LABEL позволяет переопределять атрибут определенного имени.
Формат директивы:

В качестве типа можно использовать BYTE, WORD или DWORD для
переопределения областей данных или имен структур или битовых строк.
Директивой LABEL можно переопределить выполнимый код, как NEAR или FAR.
Эта директива позволяет, например, определить некоторое поле и как DB, и
как DW. Ниже проиллюстрировано использование типов BYTE и WORD:

REDEFB LABEL BYTE
FIELDW DW 2532H
REDEFW LABEL WORD
FIELDB DB 25H
DB 32H
MOV AL,REDEFB ;Пересылка первого байта
MOV BX,REDEFW ;Пересылка двух байтов

Первая команда MOV пересылает только первый байт поля FIELDW. Вторая
команда MOV пересылает два байта, начинающихся по адресу FIELDB. Оператор
PTR выполняет аналогичные действия.

Директива NAME
—————-
Директива NAME обеспечивает другой способ назначения имени модулю:

Ассемблер выбирает имя модуля в следующем порядке:

1) если директива NAME присутствует, то ее операнд становится
именем модуля;
2) если директива NAME отсутствует, то ассемблер использует
первые шесть символов из директивы TITLE;
3) если обе директивы NAME и TITLE отсутствуют, то именем модуля
становится имя исходного файла.

Выбранное имя передается ассемблером в компоновщик.

Директива ORG
—————
Для определения относительной позиции в сегменте данных или кода
ассемблер использует адресный счетчик. Рассмотрим сегмент данных со
следующими определениями:

Смещение Имя Операция Операнд Адресный счетчик

00 FLDA DW 2542H 02
02 FLDB DB 36H 03
03 FLDC DW 212EH 05
05 FLDD DD 00000705H 09

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

Смещение Имя Операция Операнд Адресный счетчик

Первая директива ORG возвращает адресный счетчик в нулевое значение.
Поля FLDX, FLDY и FLDZ определяют те же области памяти, что и поля FLDA,
FLDB и FLDC:

Смещение: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| | | |
FLDA FLDB FLDC FLDD
| | |
FLDX FLDY FLDZ

MOV AX,FLOC ;Одно слово
MOV AL,FLDZ ;Oдин байт

Директиву ORG можно использовать для переопределения областей памяти.
При этом следует правильно устанавливать адресный счетчик и учитывать все
переопределяемые адреса памяти. Кроме того, новые переменные не должны
определять константы, так как при этом будут перекрыты константы,
определенные ранее. Директиву ORG нельзя использовать внутри определения
STRUCT.

Директива PROC
—————-
Любая процедура представляет собой совокупность кодов, начинающуюся
директивой PROC и завершающуюся директивой ENDP. Обычно эти директивы
используются для подпрограмм в кодовом сегменте. Ассемблер допускает
переход на процедуру с помощью команды JMP, но обычной практикой является
использование команды CALL для вызова процедуры и RET для выхода из
процедуры.
Процедура, находящаяся в одном сегменте с вызывающей процедурой,
имеет тип NEAR:

имя-процедуры PROC [NEAR]

Если операнд опущен, то ассемблер принимает значение NEAR no умолчанию.
Если процедура является внешней по отношению к вызывающему сегменту, то ее
вызов может осуществляться только командой CALL, а сама процедура должна
быть объявлена как PUBLIC. Более того, если в вызываемой процедуре
используется другое значение ASSUME CS, то необходимо кодировать атрибут
FAR:

PUBLIC имя-процедуры,
имя-процедуры PROC FAR

При вызове любой процедуры с помощью команды CALL необходимо
обеспечить возврат по команде RET.

Директива PUBLIC подробно описана в гл.21.

Имя директивы и имена полей могут быть любыми уникальными
идентификаторами. После каждого имени поля следует двоеточие (:) и размер
поля в битах, которое может быть от 1 до 16 бит:

Число определенных битов Принимаемый размер

BITREC RECORD BIT1:3,BIT2:7,BIT3:6

BITREC2 RECORD BIT1:3=101B,BIT2:7=0110110B,BIT3:011010B

Предположим, что директива RECORD находится перед сегментом данных.
Тогда внутри сегмента данных должен быть другой оператор, который отводит
память под данные. Для этого необходимо определить уникальное имя, имя
директивы RECORD и операнд, состоящий из угловых скобок (символы меньше и
больше):

Данное определение генерирует объектный код AD9A. который записывается как
9AAD в сегмент данных. В угловых скобках может находиться значение,
переопределяющее BITREC.
Программа на рис.24.1 иллюстрирует определение BITREC директивой
RECORD, но без начальных значений. В этом случае соответствующий оператор
в сегменте данных инициализирует каждое поле операндом в угловых скобках.
Дополнительно к директиве RECORD имеются операторы WIDTH, MASK и
фактор сдвига. Использование этих операторов позволяет изменять
определение директивы RECORD без изменения команд, которые имеют ссылки на
директиву RECORD.

О п е р а т о р WIDTH. Оператор WIDTH возвращает число битов в
директиве RECORD или в одном из ее полей. На рис.24.1 после метки А10
имеется два примера оператора WIDTH. Первая команда MOV загружает в
регистр BH число битов во всем поле RECORD BITREC (16 бит); вторая команда
MOV загружает в регистр AL число битов в поле BIT2 (7 бит). В обоих
случаях ассемблер генерирует для числа битов непосредственный операнд.

Рис.24.1. Использование диpективы RECORD

Ф а к т о р с д в и г а. Прямая ссылка на элемент в RECORD,например:

в действительности не имеет отношения к содержимому BIT2. Вместо этого
ассемблер генерирует непосредственный операнд, который содержит «фактор
сдвига», помогающий изолировать необходимое поле. Непосредственное
значение представляет собой число, на которое необходимо сдвинуть BIT2 для
выравнивания справа. На рис.24.1 после метки В10 имеются три команды,
которые загружают в регистр CL фактор сдвига для полей BIT1, BIT2 и BITЗ.

О п е р а т о р MASK. Оператор MASK возвращает «маску» из единичных
битовых значений, которые представляют специфицированное поле, иными
словами, определяют битовые позиции, которые занимает поле. Например,
оператор MASK для каждого из полей, определенных в области BITREC,
возвращает следующие значения:

Поле Двоичное значение Шестнадцатиричное значение

В1Т1 1110000000000000 Е000
В1Т2 0001111111000000 1FC0
В1ТЗ 0000000000111111 003F

На рис.24.1 три команды после метки С10 загружают в регистры значения
оператора MASK для полей BIT1, BIT2 и BITЗ. Команды после меток D10 и Е10
иллюстрируют выделение значений полей BIТ2 и BIТ1 соответственно из
области BITREC. После метки D10 в регистр АХ загружается все значение
области, определенной директивой RECORD, а затем из этого значения с
помощью оператора MASK выделяются только биты поля BIТ2:

Область RECORD: 101 0110110 011010
AND MASK BIТ2: 000 1111111 000000
Результат: 000 0110110 000000

В результате сбрасываются все биты, кроме принадлежащих к полю BIТ2.
Следующие две команды приводят к сдвигу содержимого регистра АХ на шесть
битов для выравнивания справа:

После метки Е10 в регистр AХ загружается все значение области,
определенной директивой RECORD, и так как BIТ1 является самым левым полем,
то в примере используется только фактор для сдвига значения вправо на 13
бит:

Директива SEGMENT
——————-
Ассемблерный модуль может состоять из одного или более сегментов,
части сегмента или даже частей нескольких сегментов. Формат директивы:

имя_сегмента SEGMENT [выравнивание] [объединение] [класс]
.
.
.
имя_сегмента ENDS

Все операнды являются необязательными. Ниже описаны операнды для
выравнивания, объединения и указания класса.

В ы р а в н и в а н и е. Операнд выравнивания определяет начальную
границу сегмента, например

PAGE = xxx00
PARA = хххх0 (граница по умолчанию)
WORD = ххххe (четная граница)
BYTE = ххххх

О б ъ е д и н е н и е. Операнд объединения указывает способ обработки
сегмента, при компоновке:

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

STACK: Для компоновщика операнд STACK аналогичен операнду PUBLIC. В
любой компонуемой программе должен быть определен по крайней мере
один сегмент STACK. Если объявлено более одного стека, то стековый
указатель (SP) устанавливается на начало первого стека;

COMMON: Для сегментов COMMON с одинаковыми именами и классами
компоновщик устанавливает один общий базовый адрес. При выполнении
происходит наложение второго сегмента на первый. Размер общей области
определяется самым длинным сегментом;

AT-параграф: Параграф должен быть определен предварительно. Данный
операнд обеспечивает определение меток и переменных по фиксированным
адресам в фиксированных областях памяти, таких, как ROM или таблица
векторов прерываний в младших адресах памяти. Например, для
определения адреса дисплейного видеобуфера используется

VIDEO_RAM SEGMENT AT 0B800H

Класс: Операнд класс может содержать любое правильное имя,
заключенное в одиночные кавычки. Данный операнд используется
компоновщиком для обработки сегментов, имеющих одинаковые имена и
классы. Типичными примерами являются классы ‘STACK’ и ‘CODE’.

Следующие два сегмента объединяются компоновщиком в один физический
сегмент при одном значении сегментного регистра:

———————————
Ассемблерный SEG1 SEGMENT PARA PUBLIC ‘CODE’
модуль 1 ASSUME CS:SEG1
.
SEG1 ENDS
———————————
Ассемблерный SEG2 SEGMENT PARA PUBLIC ‘CODE’
модуль 2 ASSUME CS:SEG1
.
SEG2 ENDS
———————————

Сегменты могут быть вложенными один в другой:

SEG1 SEGMENT
. Начало SEG1
SEG2 SEGMENT
. Область SEG2
SEG2 ENDS
. Конец SEG1
SEG1 ENDS

Для объединения сегментов в группы используйте директиву GROUP.

Директива STRUC
——————
Директива STRUC обеспечивает определение различных полей в виде
структуры. Данная директива не поддерживается в малом ассемблере ASM.
Формат директивы:

Имя-структуры STRUC
.
[определение полей данных]
.
Имя-структуры ENDS

Структура начинается собственным именем в директиве STRUC и
завершается таким же именем в директиве ENDS. Ассемблер записывает поля;
определенные в структуре, одно за другим от начала структуры. Правильными
операторами определения полей являются DB, DW, DD и DT с указанием имен
или без них.
На рис.24.2 директива STRUC определяет список параметров PARLIST для
ввода имени с клавиатуры. Следующий далее оператор выделяет память под
данную структуру:

Данный оператор обеспечивает адресацию структуры внутри программы. Угловые
скобки (символы меньше и больше) в данном случае пусты, но в них можно
указать данные для переопределения областей внутри структуры.
В командах ассемблера может использоваться прямая адресация по имени
структуры. Для ссылки на определенное поле внутри структуры в командах
используется имя структуры (PARAMS в данном примере) и через точку имя
конкретного поля:

Используя оператор выделения памяти, можно переопределить содержимое
полей внутри структуры. Правила для практического использования этой
возможности можно найти в руководстве по Ассемблеру.

Источник

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

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