Ограничения инструкции MOV
Почему непосредственное значение нельзя перенести в реестр сегментов напрямую (т. Е. Mov ds 10)?
Кроме того, почему сегментные регистры не могут быть скопированы напрямую (например, mov es, ds)?
.code
mov AX,@data
mov DS,AX
Почему это не может быть сделано напрямую:
mov DS, @data
Любое объяснение, почему он был разработан таким образом?
2 ответа
Основная проблема здесь - инструкция en- / decoding
X86 имеет коды операций с переменной длиной. Они могут варьироваться от одного байта (например, nop) до пары байтов, например, 12 байтов для чего-то вроде movl $0xdeadbeef, 0x12345678(%ebx,%edx,1). Intel решила не включать инструкции, которые не дают реального преимущества. Мов сегментрегистр, является одним из них. Скорее всего, потому что регистры сегментов не нужно менять очень часто.
Таким образом, это экономит место в кодировке инструкций и, таким образом, экономит пару транзисторов на чипе (по сравнению с дампами транзисторов сегодня, может быть, не так много).
Другие ISA, такие как ARM или MIPS, которые имеют фиксированный размер кодировки для своих команд, обычно допускают одинаковые операции для всех регистров. В случае ARM даже ПК является обычным регистром и может быть прочитан в письменном виде.
Потому что не было необходимости редактировать этот реестр (за исключением некоторых редких случаев), так как они устанавливаются операционной системой. Так зачем тратить кремний, делая что-то бесполезное?
Вы можете редактировать этот реестр через другой временный.