Как при использовании операнда в памяти задать ту ячейку па-мяти, с которой вы хотите работать? Очевидный ответ состоит в том, чтобы присвоить нужной переменной в памяти имя (как мы это делали в последнем разделе). С помощью, например, следующих опе-раторов вы можете вычесть переменную памяти Debts (долги) из пе-ременной памяти Assets (имущество):
Assets DW ?
Debts DW ?
mov ax,[Debts]
sub [Assets],ax
Однако адресация к памяти имеет и более глубокий смысл, ко-торый не бросается в глаза. Предположим, у вас имеется символьная строка с именем CharString, содержащая буквы ABCDEFGHIGKLM, кото-рые начинаются в сегменте данных со смещения 100, как показано на Рис. 4.1. Каким образом можно считать девятый символ (I), который расположен по адресу 108? В языке Си вы можете просто использо-вать оператор:
C = CharString[8];
(в Си элементы нумеруются с 0), а в Паскале:
C := CharString[9];
Как же это можно сделать в Ассемблере? Прямая ссылка на строку CharString здесь, конечно, не подходит, так как первым символом является символ A.
| |
|—————|
TASM2 #1-5/Док = 137 =
99 | ? |
|—————|
CharString —————> 100 | ‘A’ |
|—————|
101 | ‘B’ |
|—————|
102 | ‘C’ |
|—————|
103 | ‘D’ |
|—————|
104 | ‘E’ |
|—————|
105 | ‘F’ |
|—————|
106 | ‘G’ |
|—————|
107 | ‘H’ |
|—————|
108 | ‘I’ |
|—————|
109 | ‘J’ |
|—————|
110 | ‘K’ |
|—————|
111 | ‘L’ |
|—————|
112 | ‘M’ |
|—————|
113 | 0 |
|—————|
114 | ? |
|—————|
Рис. 5.1 Ячейки памяти со строкой символов CharString.
В действительности язык Ассемблера обеспечивает несколько различных способов адресации к строкам символов, массивам и буфе-рам данных. Наиболее простой способ состоит в том, чтобы считать девятый по счету символ строки CharString:
.DATA
CharString DB ‘ABCDEFGHIJKLM’
.CODE
mov ax,@Data
mov ds,ax
mov al,[CharString+8]
В данном случае это тоже самое, что:
mov al,[100+8]
так как CharString начинается со смещения 100. Все, что заключено в квадратные скобки, интерпретируется Турбо Ассемблером, как ад-рес, поэтому смещение CharString и 8 складывается и используется в качестве адреса памяти. Инструкция принимает вид:
mov al,[108]
как показано на Рис. 5.2.
| |
|—————|
99 | ? |
|—————|
CharString —————> 100 | ‘A’ |
|—————|
101 | ‘B’ |
|—————|
102 | ‘C’ |
|—————|
103 | ‘D’ |
|—————|
104 | ‘E’ |
|—————|
105 | ‘F’ |
|—————|
106 | ‘G’ |
|—————|
107 | ‘H’ |——-
|—————| |
CharString+8 ————> 108 | ‘I’ | |
|—————| V
109 | ‘J’ | ———
|—————| | |
110 | ‘K’ | ———
|—————| AL
111 | ‘L’ |
|—————|
112 | ‘M’ |
|—————|
113 | 0 |
|—————|
114 | ? |
|—————|
Рис. 5.1 Адресация строки символов строки CharString.
Такой тип адресации, когда ячейка памяти задается ее именем, плюс некоторая константа, называется непосредственной (прямой) адресацией. Хотя непосредственная адресация — это хороший метод, она не отличается достаточной гибкостью, поскольку обращение вы-полняется каждый раз по одному и тому же адресу памяти. Поэтому давайте рассмотрим другой, более гибкий путь адресации памяти.
