Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

1421:0000 00 50 65 72 73 6F 6e 61-6c 20 43 6f 6d 70 75 74 .Personal Comput

1421:0010 65 72 20 20 59 01 4A 41-4E 02 46 45 42 03 4D 41 .er Y.JAN.FEB.MA

1421:0020 52 33 32 36 35 34 00 00-00 00 00 00 00 00 00 00 R32654..........

1421:0030 F0 FF 59 00 21 00 03 00-04 00 07 00 08 00 09 00 ..Y.!...........

1421:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 43 50 ..............CP

1421:0050 00 00 3C 7F 00 00 11 00-00 00 0E 00 00 00 31 00 ..<...........1.

1421:0060 00 00 00 00 00 00 00 00-00 00 47 4D 00 00 00 00 ..........GM....

1421:0070 00 00 3C 7F 00 00 00 00-00 00 00 00 00 00 00 00 ..<.............

-D

1421:0080 00 00 00 00 43 50 00 00-00 00 00 00 00 00 33 33 ....CP........33

1421:0090 3E 36 33 33 73 00 00 00-0A 0E 00 00 3E 63 63 30 >633s.......>cc0

1421:00A0 1C 06 63 63 3E 00 00 00-0A 0E 00 00 FF DB 99 18 ..cc>...........

1421:00B0 18 18 18 18 3C 00 00 00-0A 0E 00 00 63 63 63 63 ....<.......cccc

1421:00C0 63 63 63 63 3E 00 00 00-0A 0E 00 00 C3 C3 C3 C3 cccc>...........

1421:00D0 C3 C3 66 3C 18 00 00 00-0A 0E 00 00 C3 C3 C3 C3 ..f<............

1421:00E0 DB DB FF 66 66 00 00 00-0A 0E 00 00 C3 C3 66 3C ...ff.........f<

1421:00F0 18 3C 66 C3 C3 00 00 00-0A 0E 00 00 C3 C3 C3 66 .<f............f

-Q

__________________________________________________________________________

Рис.5.2. Дамп сегмента данных.

Правая сторона дампа отчетливо показывает символьные данные, как,

например, "Personal Computer".

НЕПОСРЕДСТВЕННЫЕ ОПЕРАНДЫ

________________________________________________________________

На рис. 2.1 в главе 2 было показано использование непосредственных

операндов. Команда

MOV AX,0123H

пересылает непосредственную шест. константу 0123 в регистр AX. Трехбайтный

объектный код для этой команды есть B82301, где B8 обозначает "переслать

непосредственное значение в регистр AX", a следующие два байта содержат

само значение. Многие команды имеют два операнда: первый может быть

регистр или адрес памяти, а второй - непосредственная константа.

Использование непосредственного операнда более эффективно, чем

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

нее в операнде команды MOV, например,

Сегмент данных: AMT1 DW 0123H

Сегмент кодов: MOV AX,AMT1

Длина непосредственных операндов

----------------------------------

Длина непосредственной константы зависит от длины первого операнда.

Например, следующий непосредственный операнд является двухбайтовым, но

регистр AL имеет только один байт:

MOV AL,0123H (ошибка)

однако, если непосредственный операнд короче, чем получающий операнд, как

в следующем примере

ADD AX,25H (нет ошибки)

то ассемблер расширяет непосредственный операнд до двух байт, 0025 и

записывает объектный код в виде 2500.

Непосредственные форматы

--------------------------

Непосредственная константа может быть шестнадцатиричной, напpимер,

0123H; десятичной, например, 291 (которую ассемблер конвертирует в

шест.0123); или двоичной, например, 100100011В (которая преобразуется в

шест. 0123).

Ниже приведен список команд, которые допускают непосредственные

операнды:

Команды пересылки и сравнения: MOV, CMP.

Арифметические команды: ADC, ADD, SBB, SUB.

Команды сдвига: RCL, RCR, ROL, ROR, SHL, SAR, SHR.

Логические команды: AND, OR, TEST, XOR.

На рис.5.3 приведены примеры допустимых команд с непосредственными

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

переноса, сдвига и логические команды. Поскольку сейчас данные примеры не

предназначены для выполнения, в них опущено определение стека и

инициализация сегментных регистров.

__________________________________________________________________________

page 60,132

TITLE EXIMM (EXE) Пример непосредств. операндов

; (Кодируется для ассемблирования,

; но не для выполнения)

0000 DATASG SEGMENT PARA 'Data'

0000 ?? FLD1 DB ?

0001 ???? FLD2 DW ?

0003 DATASG ENDS

0000 CODESG SEGMENT PARA 'Code'

0000 BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG

; Операции пересылки и сравнения:

; ------------------------------

0000 BB 0113 MOV BX,275 ;Пересылка

0003 3C 19 CMP AL,H ;Сравнение

; Арифметические операции:

; -----------------------

0005 14 05 ADC AL,5 ;Сложение с переносом

0007 80 C7 0C ADD BH,12 ;Сложение

000A 1C 05 SBB AL,5 ;Вычитание с заемом

000C 80 2E 000 R 05 SUB FLD1,5 ;Вычитание

; Ротация и сдвиг (только на 1 бит):

; ---------------------------------

0011 D0 D3 RCL BL,1 ;Ротация влево с переносом

0013 D0 DC RCR AH,1 ;Ротация вправо с переносом

0015 D1 06 0001 R ROL FID2,1 ;Ротация влево

0019 D0 C8 ROR AL,1 ;Ротация вправо

001B D1 E1 SAL CX,1 ;Сдвиг влево

001D D1 FB SAR BX,1 ;Арифм. сдвиг вправо

001F D0 2E 0000 R SHR FLD1,1 ;Сдвиг вправо

; Логические операции:

; -------------------

0023 24 2C AND AL,00101100B ;AND (регистр)

0025 80 CF 2A OR BH,2AH ;OR (регистр)

0028 F6 C3 7A TEST BL,7AH ;TEST (регистр)

002B 80 36 0000 R 23 OR FLD1,23H ;XOR (память)

0030 BEGIN ENDP

0030 CODESG ENDS

END

__________________________________________________________________________

Рис.5.3. Команды с непосредственными данными.

Для создания элементов, длиннее чем два байта, можно использовать

цикл (см. гл.7) или строковые команды (см. гл.11).

ДИРЕКТИВА EQU

________________________________________________________________

Директива EQU не определяет элемент данных, но определяет значение,

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

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

TIMES EQU 10

Имя, в данном случае TIMES, может быть представлено любым допустимым в

ассемблере именем. Теперь, в какой-бы команде или директиве не

использовалось слово TIMES ассемблер подставит значение 10. Например,

ассемблер преобразует директиву

FIELDA DB TIMES DUP (?)

в

FIELDA DB 10 DUP (?)

Имя, связанное с некоторым значением с помощью директивы EQU, может

использоваться в командах, например:

COUNTR EQU 05

...

MOV CX,COUNTR

Ассемблер заменяет имя COUNTR в команде MOV на значение 05, cоздавая

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

MOV CX,05 ;Ассемблер подставляет 05

Здесь преимущество директивы EQU заключается в том, что многие

команды могут использовать значение, определенное по имени COUNTR. Если

это значение должно быть изменено, то изменению подлежит лишь одна

директива EQU. Естественно, что использование директивы EQU разумно лишь

там, где подстановка имеет смысл для ассемблера. В директиве EQU можно

использовать символические имена: