Система команд
С помощью 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, т.е. они рассчитаны на загрузку полного адреса операнда (сегмента и смещения).