Иллюстрированный самоучитель по Turbo Pascal

Система команд

С помощью MOV нельзя пересылать:

  • из памяти в память, например, вместо
mov Mem1,Mem2

Следует использовать:

mov ax,Mem2
mov Mem1,ax
  • константу или переменную в DS, например, нельзя
mov DS,Data_Seg

Нужно:

mov ax,Data_Seg
mov ds,ax
  • один сегментный регистр в другой, например, нельзя
mov es, ds

Но можно:

mov ax,ds
mov es,ax
  • в регистр CS; значение этого регистра (сегмента кода) автоматически меняется при выполнении дальних команд CALL и JMP; кроме того, он загружается из стека при выполнении команды RETF (выход из дальней процедуры).

Для временного сохранения регистров и данных, а также для обмена значениями между регистрами широко используются стековые команды PUSH и POP. Каждая из них работает со словом, т.е. в стек нельзя поместить или извлечь из него одиночный байт. При выполнении PUSH вначале уменьшается на 2 содержимое указателя SP, а затем операнд помещается по адресу SS: SP. При извлечении из стека сначала читается память по адресу SS: SP, а затем SP увеличивается на 2.

Таким образом, при заполнении указатель вершины стека SP смещается к младшим адресам, а при освобождении – к старшим. При работе со стеком следует помнить о специфике использования стековой памяти ("последним пришел – первым ушел"), а также о том, что эта память интенсивно используется при вызове процедур, т.е. состояние стека к моменту выхода из процедуры должно быть строго согласовано с дальнейшей работой программы. Первое условие определяет порядок извлечения данных из стека – он должен быть обратным порядку, в котором эти данные помещались в стек. Второе условие фактически означает, что после выхода из процедуры указатель SP должен содержать то же смещение, что и к моменту входа в нее. Иными словами, процедура не должна "забыть" в стеке лишнее слово или взять из него больше нужного.

Команда загрузки адреса LEA загружает в регистр адрес (смещение) нужного участка памяти. Этого же можно достичь с помощью зарезервированного слова OFFSET, стоящего перед именем переменной. Например:

var
X: Word;
……….
asm
mov ax, OFFSET X {Загружаем смещение X в АХ}
lea ax,X {To же действие}
end;

Разница состоит в том, что в случае команды LEA разрешается использовать индексную адресацию, что особенно удобно при пересылке массивов данных.

Две другие команды адресной загрузки – LDS и LES загружают первое 16-разрядное слово из источника в регистр-приемник, а затем следующее слово – в регистр DS или ES, т.е. они рассчитаны на загрузку полного адреса операнда (сегмента и смещения).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.