Загрузка...

Доступ к сегментным регистрам


Хотя для перемещения значений в сегментные регистры и из них можно использовать инструкцию 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 вы сталкивае-тесь с ограничениями, когда дело касается сегментных регистров, ведь в большинстве инструкций сегментные регистры вовсе не допус-кается использовать в качестве операндов. Сегментные регистры можно заносить в стек и извлекать из стека, но этим дело и огра-ничивается. В операциях сложения, вычитания, логических операциях или сравнениях их использовать нельзя.

Загрузка...