adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
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.
Такой тип адресации, когда ячейка памяти задается ее именем,
плюс некоторая константа, называется непосредственной (прямой)
адресацией. Хотя непосредственная адресация - это хороший метод,
она не отличается достаточной гибкостью, поскольку обращение вы-
полняется каждый раз по одному и тому же адресу памяти. Поэтому
давайте рассмотрим другой, более гибкий путь адресации памяти.
Рассмотрим следующий фрагмент программы, где в регистр AL
также загружается девятый символ CharString:
.
.
.
mov bx,OFFSET CharString+8
mov al,[bx]
.
.
.
В данном примере для ссылки на девятый символ используется
регистр BX. Первая инструкция загружает в регистр BX смещение
CharString (вспомните о том, что операция OFFSET возвращает сме-
щение метки в памяти), плюс 8. (Вычисление OFFSET и сложение для
этого выражения выполняется Турбо Ассемблером во время ассембли-
рования.) Вторая инструкция определяет, что AL нужно сложить с
содержимым по смещению в памяти, на которое указывает регистр BX
(см. Рис. 5.3).
mov al,[108]
как показано на Рис. 5.2.
. .
. .
| |
|--------------|
99 | ? |
|--------------|
CharString --------------> 100 | 'A' |
|--------------|
101 | 'B' |
|--------------|
102 | 'C' |
|--------------|
103 | 'D' |
|--------------|
104 | 'E' |
|--------------|
105 | 'F' |
|
adfun.ru
|
|
|
|