назад
Память и
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
(результаты вычислений можете проверить сложением в
"столбик")