Инструменты пользователя

Инструменты сайта


examination:asm:question15

Вопрос №15. Обработка символьной информации на ЯА. Работа со строками. Примеры

Обработка символьной информации

1.3.6. Представление символьных данных

Как вы уже знаете, компьютер может оперировать только двоичными числами. Поэтому у вас может возникнуть вопрос: как же тогда в нем должны храниться символьные данные? Для этого нужно заранее определить таблицу символов, с помощью которой будет установлено взаимно однозначное соответствие между символами алфавита и целыми числами. До недавнего времени коды, составляющие таблицы символов, были 8-разрядными. Однако поскольку в мире существует огромное количество языков, имеющих совершенно разную структуру, для их поддержки в компьютере была создана универсальная 16-разрядная кодовая таблица, которую назвали Unicode.

При работе в текстовом режиме, таком как сеанс MS DOS, в совместимых с IBM PC компьютерах используется стандартная таблица символов ASCII. Эта аббревиатура расшифровывается как American Standard Code for Information Interchange, или Американский стандартный код обмена информацией. В таблице ASCII каждому символу назначается стандартный уникальный 7-разрядный двоичный код. Так как в ASCII-кодах используются только младшие 7 битов каждого байта, то дополнительный 8-й бит может использоваться на различных компьютерных платформах для поддержки локальной таблицы символов. Например, в совместимых с IBM PC компьютерах значения кодов ASCII-таблицы в диапазоне от 128 до 255 используются для представления псевдографических символов, а также символов греческого алфавита.

ASCII-строки. Последовательность одного или нескольких символов называется строкой. Строки в формате ASCII (или ASCII-строки) хранятся в памяти компьютера в виде последовательности байтов, содержащих ASCII-коды. Например, текстовой строке «АВС123» соответствует последовательность байтов, заданных в шестнадцатеричном виде (об этом свидетельствует символ «h», указанный в конце числа): 41h, 42h, 43h, 31h, 32h и 33h. Если в конце последовательности символов находится байт, содержащий нулевое значение 00h, такая строка называется нуль-завершенной (null-terminated) и обозначается как ASCIIZ. Нуль-завершенные строки широко используются в таких языках программирования, как С и C++. Кроме того, эти строки в формате ASCIIZ часто передаются в виде параметров при вызове функций операционных систем MS DOS и Windows.

Команды обработки строковых примитивов

В системе команд процессоров Intel предусмотрено пять групп команд для обработки массивов байтов, слов и двойных слов (табл. 9.1). Несмотря на то, что все они называются строковыми примитивами, область их использования не ограничивается только массивами строк.

Для адресации памяти в командах, приведенных в табл. 9.1, используется регистр ESI, EDI или сразу оба этих регистра. Особенность этих команд состоит в том, их операнды расположены в памяти. При обработке строковых примитивов эти команды могут автоматически повторяться, что делает их применение особенно удобным для работы с длинными строками и массивами.

При работе программы в защищенном режиме адресация памяти в командах обработки строковых примитивов может осуществляться через регистры ESI или EDI. При этом смещение, находящееся в регистре ESI, отсчитывается относительно сегмента, чей дескриптор указан в регистре DS, а смещение, указанное в регистре EDI, отсчитывается относительно сегмента, чей дескриптор указан в регистре ES. Следует заметить, что при использовании линейной модели памяти, в сегментных регистрах DS и ES находится одно и то же значение, которое в программе нельзя менять. В отличие от этого, при написании программ для реального режима адресации, программисты часто манипулируют значениями сегментных регистров DS и ES.

Использование префикса повторения. Сами по себе команды обработки строковых примитивов выполняют только одну операцию над байтом, словом или двойным словом памяти. Однако, если перед ними указать префикс повторения, выполнение команды будет повторено столько раз, сколько указано в регистре ЕСХ. Другими словами, с его помощью вы можете выполнить обработку целого массива с помощью всего одной команды. Существует несколько типов префиксов повторения (табл. 9.2).

В приведенном ниже примере с помощью команды MOVSB копируется 10 байтов памяти из переменной string1 в переменную string2. При использовании префикса повторения перед выполнением команды MOVSB проверяется значение регистра ЕСХ. Если оно равно нулю, команда MOVSB не выполняется и управление передается следующей за ней команде. Если значение в регистре ЕСХ больше нуля, оно уменьшается на единицу и выполнение команды повторяется:

При каждом повторении команды MOVSB значения регистров ESI и EDI автоматически увеличиваются или уменьшаются на единицу в зависимости от состояния флага направления DF.

Флаг направления. Состояние этого флага влияет на то, как в процессе выполнения команд обработки строковых примитивов изменяются значения регистров ESI и EDI. Если флаг сброшен, они увеличиваются на размер обрабатываемого операнда (1,2 или 4 байта), а если установлен, то уменьшаются (табл. 9.3).

Значение флага направления можно явно задать с помощью команд CLD и STD:

CLD Сбрасывает флаг направления

STD Устанавливает флаг направления

examination/asm/question15.txt · Последние изменения: 2014/01/15 12:12 (внешнее изменение)