ТОП 10:

Загрузка сегментных регистров



Команда:LDS приемник,источник

• Назначение: Загрузить адрес, используя DS

• Процессор: 8086

• Команда:LES приемник,источник

• Назначение: Загрузить адрес, используя ES

• Процессор: 8086

• Команда:LFS приемник,источник

• Назначение: Загрузить адрес, используя FS

• Процессор: 80386

• Команда:LGS приемник,источник

• Назначение: Загрузить адрес, используя GS

• Процессор: 80386

• Команда:LSS приемник,источник

• Назначение: Загрузить адрес, используя SS

• Процессор: 80386

Второй операнд (источник) для всех этих команд — переменная в па­мяти размером в 32 или 48 бит (в зависимости от разрядности операндов). Первые 16 бит из этой переменной загружаются в соответствующий сег­ментный регистр (DS для LDS, ES для LES и т. д.), а следующие 16 или 32 — в регистр общего назначения, указанный в качестве первого операнда. В защищенном режиме значение, загружаемое в сегментный ре­гистр, всегда должно быть правильным селектором сегмента (в реальном режиме любое число может использоваться как селектор).

Другие команды

Команда:NOP

• Назначение: Отсутствие операции

• Процессор: 8086

NOР — однобайтная команда (код 90h), которая не выполняет ничего, только занимает место и время. Код этой команды фактически соответствует команде XCHG AL,AL. Можно многие команды записать так, что они не будут приводить ни к каким действиям, например:

mov ах,ах ; 2 байта

xchg ах,ах ; 2 байта

lea bx,[bх+0] ; 3 байта (8Dh, 5Fh, 00h, но многие ассемблеры,

; встретив такую команду, реально используют более

; короткую команду lea bx [bх] с кодом 8Dh 1Fh)

shl еах,0 ; 4 байта

shrd еах,еах,0 ; 5 байт

 

• Префикс:LOCK

• Назначение: Префикс блокировки шины данных

• Процессор: 8086

На все время выполнения команды, снабженной таким префиксом, будет заблокирована шина данных, и если в системе присутствует дру­гой процессор, он не сможет обращаться к памяти, пока не закончится выполнение команды с префиксом LOCK. Команда XCHG автоматически всегда выполняется с блокировкой доступа к памяти, даже если префикс LOCK не указан. Этот префикс можно использовать только с командами ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD и XCHG.

 

• Команда:UD2

• Назначение: Неопределенная операция

• Процессор: Р6

Эта команда всегда вызывает ошибку «неопределенная операция» (исключение #UD). Впервые она описана как таковая для Pentium Pro, но во всех предыдущих процессорах эта команда (код 0Fh 0Bh) не была определена и, естественно, приводила к такой же ошибке. UD2 предназ­начена для тестирования программного обеспечения, в частности опе­рационных систем, которые должны уметь корректно обрабатывать та­кую ошибку. Название команды происходит от команды UD (код 0Fh 0FFh), которая была определена AMD для процессоров AMD K5.

 

• Команда:CPUID

• Назначение: Идентификация процессора

• Процессор: 80486

CPUID сообщает информацию о производителе, типе и модифика­ции процессора, о наличии и поддержке различных расширений. Коман­да CPUID поддерживается Intel, начиная с процессоров Intel 80486DX/SX/DX2 SL, UMC U5S, Cyrix Ml, AMD 80486DX4. Процессор поддерживает эту команду, если возможна установка флага ID в 1 (бит 21 в peгистpe EFLAGS).

Результат работы CPUID зависит от значения регистра ЕАХ. Если ЕАХ = 0, CPUID возвращает в ЕАХ максимальное значение, с которым ее можно вызывать (2 для Р6, 1 для Р5), а регистры EBX:ECX:EDX со­держат 12-байтную строку — идентификатор производителя (табл. 8).

Например, для процессоров Intel регистр ЕВХ содержит «Genu» (756E6547h), ЕСХ содержит «ineI» (49656E69h), a EDX — «ntel» (6C65746Eh).

Если ЕАХ = 1, CPUID возвращает в ЕАХ информацию о версии про­цессора, а в EDX — информацию о поддерживаемых расширениях, относящихся к работе процессора в защищен­ном режиме. Значения битов EAX следующие: биты 3 – 0 — модификация; биты 7 – 4 — модель; биты 11 – 8 — семейство (3 для 386, 4 для 486, 5 для Pentium, 6 для Pentium Pro); биты 13 – 12 — тип (0 — OEM, I — Overdrive, 2 — Dual); биты 31–14 зарезервированы и равны нулю.

 

Таблица 8. Строки производителей в CPUID
  Производитель Строка в EBX:ECX:EDX  
  Intel GenuineIntel  
  UMC UMC UMC UMC  
  Cyrix CyrixInstead  
  AMD AuthenticAMD  
  NexGen NexGenDriven  
  Centaur Technology CentaurHalls  
       

 

 

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

 

Каждая программа на языке ассемблера содержит кроме команд процес­сора еще и специальные инструкции, указывающие самому ассемблеру, как организовывать различные секции программы, где располагаются данные, а где команды, позволяющие создавать макроопределения, вы­бирать тип используемого процессора, организовывать связи между процедурами и т. д. Эти инструкции условно разделяют на директивы и операторы. Разные ассемблеры используют раз­личные наборы директив. Ассемблер TASM поддерживает набор директив MASM наряду с несовмести­мым собственным, известным как Ideal Mode. Все рассматриваемые ниже примеры рассчитаны на режим MASM, то есть для их подготовки можно использовать оба ассемблера.

 

Структура программы

Программа на языке ассемблера состоит из строк, имеющих следующий вид:

метка команда/директива операнды ; комментарий

Все эти поля могут быть необязательными. Метка может быть любой комби­нацией букв английского алфавита, цифр и символов «_», «$», «@», «?», но цифра не может быть первым символом метки, а символы «$» и «?» иногда могут иметь специальные значения и обычно не рекомендуются к использованию. Большие и маленькие буквы по умолчанию не различаются, но различие обычно можно включить, задав определенную опцию в командной строке ассемблера. Во втором поле, поле команды, может располагаться команда процессора, которая будет транслирована в исполнимый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера. В поле операндов располагаются требуемые командой или директивой операнды (то есть нельзя указать операнды и не указать команду или директиву). И наконец, в поле комментариев, начало которого отмечается символом «;» (точка с запятой), можно написать любые символы, — текст от символа «;» до конца строки не анализируется ассемблером.

Если метка располагается перед командой процессора, сразу после нее всегда ставится оператор «:» (двоеточие), который указывает ассемблеру, что надо создать переменную с этим именем, содержащую адрес текущей команды:

 

metka: mov ax,5

Если метка стоит перед директивой ассемблера, она обычно оказывается одним из операндов этой директивы и двоеточие не ставится. Рассмотрим директивы, работающие напрямую с метками и их значениями, — LABEL, EQU и =.

 

метка label тип

Директива LABEL определяет метку и задает ее тип. Тип может быть
одним из: BYTE (байт), WORD (слово), DWORD (двойное слово), FWORD (6 байт), QWORD (учетверенное слово), TBYTE (10 байт), NEAR (ближняя метка), FAR (дальняя метка). Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда

mov метка,0

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

call метка

выполнит ближний или дальний вызов подпрограммы.

С помощью директивы LABEL удобно организовывать доступ к од­ним и тем же данным, как к байтам, так и к словам, определив перед дан­ными две метки с разными типами.

 

метка equ выражение

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

 

truth equ 1

message1 equ ‘Try again$‘

var2 equ 4[si]

cmp ax,truth ; cmp ax,1

db message1 ; db 'Try again$'

mov ax,var2 ; mov ax, 4[si]

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

 

метка = выражение

Директива «=» эквивалентна EQU, но определяемая ею метка может принимать только целочисленные значения. Кроме того, метка, опреде­ленная директивой «=», может быть пере­определена.

Каждый ассемблер предлагает целый набор специальных предопре­деленных меток — это может быть текущая дата (@date или ??date), тип процессора (@cpu) или имя того или иного сегмента программы. Одна из предопределенных меток, поддерживаемая рас­сматриваемыми нами ассемблерами, — «$». Метка «$» всегда соответствует текущему адресу. Например, команда

jmp $

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

 







Последнее изменение этой страницы: 2016-08-15; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.235.172.213 (0.008 с.)