Хотя для перемещения значений в сегментные регистры и из них можно использовать инструкцию MOV, это особый случай, более огра-ниченный, чем другие случаи использования инструкции MOV. Если одним из операндов инструкции MOV является сегментный регистр, то другим операндом должен быть регистр общего назначения или ячейка памяти. Загрузить константу в сегментный регистр непосредственно невозможно, и невозможно непосредственно скопировать один сегмен-тный регистр в другой сегментный регистр.
Так как имена сегментов являются константами, необходимо загружать сегментные регистры таким же образом, как общие регист-ры или переменную в памяти. Вот, например, два способа установки регистра ES в значение сегмента .DATA:
.DATA
DataSeg DW @Data
.CODE
mov ax,@Data
mov es,ax
mov ex,[DataSeg]
Вместо этого хотелось бы сделать следующее:
mov es,@Data ; недопустимо!
но это работать не будет.
Чтобы скопировать содержимое одного сегментного регистра в другой сегментный регистр, вам придется передать значение через регистр общего назначения или память. Инструкции:
mov ax,cs
mov ds,ax
и
push cs
pop ds
копируют содержимое регистра CS в DS. Первый метод работает быст-рее, но при втором методе требуется меньший объем кода.
Не удивляйтесь, при работе с инструкцией MOV вы сталкивае-тесь с ограничениями, когда дело касается сегментных регистров, ведь в большинстве инструкций сегментные регистры вовсе не допус-кается использовать в качестве операндов. Сегментные регистры можно заносить в стек и извлекать из стека, но этим дело и огра-ничивается. В операциях сложения, вычитания, логических операциях или сравнениях их использовать нельзя.
