Это гарантирует не push cs
, а комбинация push cs; pop ds;
.
Первая инструкция копирует текущее значение cs
в стек, а вторая извлекает это значение из стека и помещает его в регистр ds
.
В ответ на ваш запрос о дополнительной информации давайте начнем со следующего стека и регистров:
stack=[1,2,3], cs=7, ds=6
После push cs
, который помещает значение регистра cs
в стек:
stack=[1,2,3,7], cs=7, ds=6
После pop ds
, который извлекает значение из стека и помещает его в регистр ds
:
stack=[1,2,3], cs=7, ds=7
И это в основном все.
Я не могу вспомнить, как можно было перевести между сегментными регистрами инструкцию mov
(я не думаю, что это было так, но я могу ошибаться, и это потребовало бы толчка / поп последовательность). Эта ссылка , кажется, подтверждает, что: нет опции mov
с сегментным регистром в качестве источника и адресата.
Но даже если бы это было так, ассемблерные кодеры часто выбирали более подходящие инструкции, либо для скорости, либо для компактного кода (или обоих), например, для использования xor ax, ax
вместо mov ax, 0
.