Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Исследование процессов вводавывода информации и системы арифметических команд x86 микропроцессоров семейства Intel. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
949 Кб
Скачать

непосредственно пересылать содержимое одного сегментного регистра в другой. Подобные ситуации разрешаются с использованием других регистров микропроцессора. Например:

MOV AX, SEGMENT

MOV DS, AX

МOV AX,DS

MOV ES, AX

или

PUSH DS

POP ES

Рассмотрим еще несколько примеров команды MOV:

1)MOV DS, AX; переслать (АХ) в DS

2)MOV AL,’E’; переслать в AL ASCII код буквы Е

3)MOV [BX], DX переслать (DX) в ячейку адресованную (ВХ)

Здесь ЕА прибавляется к (DS)×16;

4) MOV AX, Y[BP][SI]; переслать в АХ содержимое ячейки памяти, определенной суммой (ВР), (SI) и смещения Y

21

Здесь ЕА прибавляется к (DS)×16.

Отметим, что при использовании регистра ВР в качестве базового эффективный адрес ЕА всегда складывается с содержимым сегментного регистра SS, умноженного на 16.

Приведем варианты фрагментов программы, которые помещают в регистр AL, используя различные способы адресации, ASCII код буквы I из символьной цепочки "ABCDEFGHIJKLM". Цепочка предварительно вводится в оперативную память командой ассемблера DB, которая помечается меткой CharString. Например:

.DATA; определение сегмента данных

MAIN DB 'MAIN'

CharStrmg DB ’ABCDEFGHIJ’

.CODE; определение сегмента кода.

MOV AX,@DATA; в регистр АХ загружается; сегментный адрес сегмента данных;

MOV DS,AX; в регистр DS помещается; содержимое регистра АХ

Отметим, что каждый символ занимает в памяти один байт. Символ I смещен относительно А на 8 байт. На рис. 6 приведено расположение цепочки в памяти.

22

Рис. 6. Расположение цепочки "ABCDEFGHIJKLM" в памяти

MOV SI,OFFSET CharString + 8; в регистр SI;

загружается смещение строки CharString относительно начала сегмента данных; на 8 байт (непосредственная адресация)

MOV AL,[SI]; в регистр АХ помещается; значение символа I из строки символов (регистровая относительная; адресация)

MOV ВХ,8

MOV AL,[CharString + ВХ]

MOV BX,OFFSET CharString

MOV AL,[BX + 8]

MOV SI,6

MOV AL,[CharString + SI + 2]

MOV BX,OFFSET CharString

23

MOV DI,8

MOV AL,[BX + DI]

MOV SI,OFFSET CharString

MOV BX,8

MOV AL,[SI + BX]

MOV BX,OFFSET CharString

MOV SI,7

MOV AL,[BX + SI + 1]

В приведенном примере команда OFFSET загружает начальный адрес цепочки ABCDEFGHIJ относительно начала сегмента данных. Знак @ загружает адрес начала сегмента, имя которого стоит за этим знаком. В нашем примере сегмента данных DATA. Если возникает необходимость сменить сегмент данных, то это можно сделать, например следующим образом:

MOV AL,ES:[SI]; DS заменен на ES MOV SS:[BX+4],AX; DS заменен на SS

Если переменная в памяти имеет собственную метку (идентификатор), например MEMR_VAR, то её можно вызвать командой:

MOV BX,MEMR_VAR

Многие команды ассемблера оперируют байтами или словами. Если с помощью соответствующих директив переменная COST определена как слово, а переменная COUNT как байт, то команда INC COST оперирует словом, а команда INC COUNT-байтом. Однако в некоторых случаях ассемблер не может определить тип операнда. Команда INC [ВХ] производит инкремент величины, адрес которой находится в регистре ВХ. Но является эта величина байтом или словом? Аналогичная ситуация возникает при использовании команды:

MOV [ВХ],1

24

Встретив такую команду, TASM зафиксирует ошибку. Чтобы исключить указанную неопределенность, используют атрибутные операторы, например оператор указателя PTR:

MOV WORD PTR[BX],1; запись слова

MOV BYTE PTR [BX],1; запись байта

Команды LEA, LDS, LES. Эти команды отличаются от других команд пересылки тем, что при их выполнении в адресуемые регистры передаются не собственно данные, а их адреса. Они занимают в памяти от 2 до 4 байт. Основное назначение этих команд

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

LEA reg, memr

обеспечивает вычисление эффективного адреса ЕА ячейки памяти в соответствии с указанным способом адресации и загружает ЕА (а не содержимое адресуемой ячейки) в указанный общий регистр. Например, команда: LEA BX,COL[BP] загрузит в регистр ВХ эффективный адрес ЕА, вычисленный сложением содержимого ВР и смещения COL. Такая операция может потребоваться, например, для загрузки начального адреса таблицы в регистр ВХ, перед выполнением команды XLAT. Команды

LDS SI, memr и LES DI, memr

загружают адресную информацию из памяти в пару регистров DS:SI и ES:DI соответственно. Первое слово из памяти загружается в сегментный регистр, а второе слово – в индексный регистр. Эти команды управляют коммутацией сегментов данных.

Команда XCHG. Эта команда осуществляет обмен данными между источником и получателем: XCHG dst, src

Так как непосредственные операнды обменять невозможно, ни один из операндов команды XCHG не может быть константой. В двоичных

25

кодах данная команда имеет два формата. Общий формат (длиной 2 байта) позволяет произвести обмен содержимым любой пары общих регистров, а так же обмен регистров и ячеек памяти при любом допустимом способом адресации. Укороченный формат(один байт) осуществляет обмен любого общего регистра и аккумулятора AX(AL). Команда XCHG AX,AX используется как команда пустой операции NOP, обеспечивающей задержку 3 такта. Отметим, что эта команда не работает с сегментными регистрами.

Стековые команды PUSH и РОР. Эти команды могут занимать от одного до шести байт. Они оперируют словами и автоматически изменяют указатель стека (SР). В качестве операндов может быть указан любой из регистров микропроцессора или ячейка памяти. В МП86 не предусмотрены команды записи в стек непосредственных операндов. Для сохранения в стеке и извлечения из стека регистра флажков введены две дополнительные безоперандные команды

PUSHF и POPF.

ВНИМАНИЕ! Команда POPF изменяет все флажки в регистре флажков.

Команда записи (вложения) в стек имеет мнемонику: PUSH src и производит следующие действия: SP← (SP)-2; SP← (SP)-2 TOS (src). Здесь TOSвершина аппаратного стека, которая имеет адрес [SS:SP].

Команда извлечения из стека имеет мнемонику: POP dst и выполняет следующие действия: dst (TOS); SP←(SP) + 2.

Префикс программного сегмента (PSP)

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

1)создает копию блока «окружения среды»;

2)резервирует область оперативной памяти ЭВМ для программы пользователя;

3)создает префикс программного сегмента (РSР);

26

4)загружает программу пользователя (программа загружается сразу за PSP);

5)производит настройку программы пользователя (если это необходимо) и сегментных регистров на область оперативной памяти, где расположена программа пользователя;

6)передает управление программе пользователя.

Наибольший интерес для прикладных программ представляет PSP. Расположение программы пользователя и PSP в оперативной памяти ЭВМ показано на рис. 7.

Рис. 7. Расположение PSP в оперативной памяти ЭВМ

Префикс программного сегмента – это особая область памяти, предназначенная для связи программы пользователя с «родительским» процессом, т.е. работой всей системы под управлением DOS. Размер этой области равен 256 байт и имеет строгий формат. Из них первые 128 байт используются для непосредственной связи с головной программой и в данной работе

27

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

Например, прикладная программа была запущена из командной строки:

primer.exe t s /F:5 пример

В PSP эта строка будет расположена так, как приведено на рис. 8.

Рис. 8. Расположение строки t s /F:5 пример в PSP

Отметим, что при запуске программы DOS производит настройку сегментных регистров по следующему правилу ЕХЕ программы:

в CS-загружается сегментный адрес запускаемого сегмента кода программы пользователя;

в SS-загружается сегментный адрес запускаемого сегмента стека программы пользователя;

в DS и ESзагружается сегментный адрес PSP.

По адресу хх080 расположена длина переданной программе строки (18 байт), а начиная с адреса хх081 расположена строка параметров, включая первый пробел, расположенный после названия программы. Необходимо отметить, что строка параметров заканчивается символами возврата каретки (0Dh) и перевода строки

28

(ОАh), необходимых для того, чтобы следующая выведенная на экран компьютера строка начиналась с новой строки. Признаком конца строки является Zero-бaйт (00h по адресу хх093). Вся оставшаяся часть PSP, включая байт по адресу xx0FF, как правило, будет заполнена DOSом Zero-байтом. Таким образом, через PSP можно передать программе первые 124 байта из командной строки, следующие за названием программы. Также отметим, что копия параметров из командной строки в другую область памяти будет полной, включая знаки препинания, знаки псевдографики и национального алфавита.

Арифметические команды

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

1)числа вводятся в ЭВМ в неупакованном BCD-формате;

2)неупакованный BCD-формат преобразуется в двоичный формат;

3)в двоичном формате выполняются операции, заданные в программе;

4)результат, представленный в двоичном формате, преобразуется в неупакованный BCD-формат и выводится из ЭВМ.

Команды сложения и вычитания. Команды сложения и вычитания, используемые микропроцессором Intel 80×86, приведены в табл. 3.

29

 

 

Таблица 3

Команды сложения и вычитания

 

 

 

 

Название

Мнемоника и формат

Описание

 

 

 

 

 

Сложение

add dst,src

(dst)←(src)+(dst)

 

Сложение с переносом

adc dst,src

(dst)←(src)+(dst)+(CF)

 

Вычитание

sub dst,src

(dst)←(src) – (dst)

 

Вычитание с заёмом

sbb dst,src

dst)←(src)–(dst) – (CF)

 

 

 

 

 

В качестве операндов dst и src в этих командах могут быть указаны общие регистры и ячейки памяти с любым режимом адресации. Кроме того, в качестве src может быть указан и непосредственный операнд. Результат выполнения этих команд изменяет состояние следующих флагов: OF, SF, AF, PF, CF.

Отметим, что бит CF устанавливается в “1”, когда возникает перенос из 16-ого разряда при сложении и заём в 16-й разряд при вычитании. Состояние этого флага можно использовать для анализа переполнения при работе с беззнаковыми операндами. В арифметике двойной и т.д. точности этот флаг используется в командах adc и sbb. Признаком переполнения при работе со знаковыми числами служит состояние флага OF.

Приведём пример сложения с двойной точностью:

перенос

0015 65А0

+

0021 В79Е

0037 1D3E

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]