назад

Память и CPU. Инструкция сложения.

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

Например: требуется сложить числа, хранящиеся в регистрах AX и BX. Для выполнения этой задачи, необходимо сообщить микропроцессору инструкцию. В данном случае инструкция будет состоять из двух кодов: 01h и D8h (двухбайтная инструкция).

01h (команда)   - сложить содержимое регистров

D8h (аргументы) - регистры AX и BX

Все инструкции, передаваемые микропроцессору на выполнение, должны располагаться в ОЗУ компьютера. ОЗУ - оперативное запоминающее устройство или оперативная память. В ОЗУ хранятся все исполняемые программы: Windows, MsWord, Explorer и др. Поэтому, инструкция должна быть записана в область ОЗУ, свободную от загруженных программ.

Рассмотрим структуру оперативной памяти, и определим место для хранения инструкции сложения регистров AX и BX.

ОЗУ состоит из множества упорядоченных, однобайтовых ячеек. Каждая ячейка имеет уникальный номер (адрес).

Адрес ячейки состоит из двух частей:

0ABD:0100 - полный адрес

0ABD      - сегмент

     0100 - смещение

0000:0000 - первый адрес ОЗУ

FFFF:FFFF - последний адрес ОЗУ

 

адрес

Ячейка

0000:0000

8A

0000:0001

10

0000:0002

1C

…

…

0ABD:0100

04

0ABD:0101

8B

0ABD:0102

00

…

…

FFFF:FFFD

00

FFFF:FFFE

00

FFFF:FFFF

00

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

Область ОЗУ [0000:0000...0ABD:0000] заполнена различными программами, трогать данный раздел не рекомендуется. Начиная с адреса 0ABD:0100 можно писать свои инструкции. Этот адрес хранится в регистрах специального назначения CPU:

DS=0ABD, ES=0ABD, SS=0ABD, CS=0ABD и IP=0100.

Для записи в ОЗУ кодов инструкции сложения AX + BX, воспользуемся командой "E" (Edit):

-e 100 <Enter>

0ABD:0100  04.01 <Enter>

-e 101 <Enter>

0ABD:0101  8B.D8 <Enter>

Запишите в регистры следующие числа: AX = 4, BX = 3. Просмотрите регистры:

-r

AX=0004  BX=0003  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=0ABD  ES=0ABD  SS=0ABD  CS=0ABD  IP=0100   NV UP EI PL NZ AC PO NC

0ABD:0100 01D8          ADD     AX,BX

В третьей строке листинга находится следующая информация:

0ABD:0100 - адрес инструкции сложения

     01D8 - коды инструкции

ADD AX,BX - мнемокод инструкции

Мнемокод служит для наглядного восприятия инструкций CPU.

Теперь все готово для выполнения операции сложения. Команда "T" (Trace) дает указание микропроцессору трассировать (выполнить) одну инструкцию:

-t

AX=0007  BX=0003  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=0ABD  ES=0ABD  SS=0ABD  CS=0ABD  IP=0102   NV UP EI PL NZ AC PO NC

0ABD:0102 00E8          ADD     AL,CH

Микропроцессор выполнил сложение AX + BX и занес результат в регистр AX. Теперь в третьей строке находится адрес и мнемокод следующей инструкции. Откуда она взялась? Это фрагмент программы или данных, которые потеряли свою актуальность до загрузки Debug.

Также изменил свое значение регистр IP = 0102 (было 0100). IP (Instruction Point) - указывает на инструкцию, которую должен выполнить CPU. Верните IP в исходное состояние:

-r ip

IP=0102

:100

Вновь просмотрите регистры:

-r

AX=0007  BX=0003  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=0ABD  ES=0ABD  SS=0ABD  CS=0ABD  IP=0100   NV UP EI PL NZ AC PO NC

0ABD:0100 01D8          ADD     AX,BX

Выполните трассировку, и убедитесь, что AX = 000A: 7h + 3h = Ah. Обратите внимание, что коды инструкции ADD AX, BX постоянно остаются в памяти. Для трассировки инструкции, необходимо указывать в регистре IP ее адрес (в данном случае IP = 100).

Упражнение №1

Используя инструкцию ADD, выполните следующие действия:

1. 0100 + 0F00     3. 00FF + 0001     5. 0123 + 0235

2. F03E + 01E8     4. 98A4 + 493E     6. 0E8F + 0111

(результаты вычислений можете проверить сложением в "столбик")