Режимы адресации к памяти


Как при использовании операнда в памяти задать ту ячейку па-мяти, с которой вы хотите работать? Очевидный ответ состоит в том, чтобы присвоить нужной переменной в памяти имя (как мы это делали в последнем разделе). С помощью, например, следующих опе-раторов вы можете вычесть переменную памяти 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.

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

Загрузка...