Справочник по языку Ассемблера IBM PC


Команды работы с адресами и указателями памяти - часть 2



При применении этих директив возможен частный случай, когда в поле операндов указывается имя другой директивы определения данных (фактически, имя переменной). В этом случае в памяти формируется адрес этой переменной. Какой адрес будет сформирован (эффективный или полный), зависит от применяемой директивы. Если это dw, то в памяти формируется только 16-битное значение эффективного адреса, если же dd — в память записывается полный адрес. Размещение этого адреса в памяти следующее: в младшем слове находится смещение, в старшем — 16-битная сегментная составляющая адреса.

Например, при организации работы с цепочкой символов удобно поместить ее начальный адрес в некоторый регистр и далее в цикле модифицировать это значение для последовательного доступа к элементам цепочки. В листинге 1 производится копирование строки байт str_1 в строку байт str_2.


В строках 12 и 13 в регистры si и di загружаются значения эффективных адресов переменных str_1 и str_2.


В строках 16 и 17 производится пересылка очередного байта из одной строки в другую. Указатели на позиции байтов в строках определяются содержимым регистров si и di. Для пересылки очередного байта необходимо увеличить на единицу регистры si и di, что и делается командами сложения inc (строки 18, 19). После этого программу необходимо зациклить до обработки всех символов строки.

  Листинг 1. Копирование строки <1>;---------Prg_7_2.asm--------------- <2>     masm <3>     model   small <4>     .data <5>     ... <6>     str_1 db        ‘Ассемблер — базовый язык компьютера’ <7>     str_2   db      50 dup (‘ ‘) <8>     full_pnt        dd str_1 <9>     ... <10>    .code <11>    start: <12>    ... <13>    lea     si,str_1 <14>    lea     di,str_2 <15>    les     bx,full_pnt     ;полный указатель на str1 в пару es:bx <16>    m1: <17>    mov     al,[si] <18>    mov     [di],al <19>    inc     si <20>    inc     di <21> ;цикл на метку m1 до пересылки всех символов <22> ... <23>    end     start

Необходимость использования команд получения полного указателя данных в памяти, то есть адреса сегмента и значения смещения внутри сегмента, возникает, в частности, при работе с цепочками.


В строке 14 листинга 1 в двойном слове full_pnt формируются сегментная часть адреса и смещение для переменной str_1. При этом 2 байта смещения занимают младшее слово full_pnt, а значение сегментной составляющей адреса — старшее слово full_pnt. В строке 14 командой les эти компоненты адреса помещаются в регистры bx и es. 




- Начало -  - Назад -  - Вперед -