XOR EDX,EDX обнуляет RDX ??? (64 bit mode)

Тема в разделе "WASM.ASSEMBLER", создана пользователем Gray, 25 мар 2009.

  1. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    С удивлением обнаружил, что в 64 bit моде xor edx,edx обнуляет не только edx, а весь rdx. Коллеги, где про это почитать можно?
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Gray
    manual ?
     
  3. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    wsd
    Обнаружил экспериментально отладчиком под OpenSuse x86_64. Надеюсь, что это не глюк процессора (в моем случае Core 2 Duo), а 64-битное белое пятно в моем ассемблерном опыте. Вот и интересуюсь доками, где это хоть как-то упомянуто.
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ну так тебе и ответили.
    В Intel® 64 and IA-32 Architectures Software Developer's Manual про это написано.
    http://www.intel.com/products/processor/manuals/
    Есть аналогичные мануалы от AMD, в них тоже написано.
    Это не баг, так задумано.
     
  5. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Gray
    Совсем скоро ты сможешь обнаружить, что верхняя часть 64-х битного регистра обнуляется не только при XOR, а при любой арифметической/битовой операции с 32-х битным регистром.
     
  6. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    Разумеется, прежде чем написать в форум, я пару часов шерстил эти интеловские доки, но, увы, так и не нашел ничего на эту тему. Хотелось бы более конкретной ссылки, а не банального RTFM.
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Volume 1: Basic Architecture
    3.4.1.1 General-Purpose Registers in 64-Bit Mode
    ...
     
  8. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    конечно обнуляет, так и задумано. и опкод поменьше получается.
     
  9. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    cppasm

    Благодарствую. Вы мне очень помогли.

    t00x
    Скорее не так задумано, а так получилось. Ведь остались занятыми более длинные дублирующие опкоды (xor rax,rax... xor rbx,rbx и т.д. ) Если бы так задумывалось, то было бы логично нагрузить эти опкоды другой функциональностью. Например обнулением пар регистров. Когда-то подобное "так задумано" звучало в оправдание существования двух опкодов для int 3 (CC и CD 03)... и двух вариантов начала заголовка EXE файла (MZ и ZM)
     
  10. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Gray
    1.1. инструкция xor rax, rax логически _не_дублирует_ xor eax, eax... в явном виде.
    1.2. сделали 2 разных опкода для одного аппарного действия.

    2.1. CC и CD 03 - две разные инструкции.
     
  11. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    t00x
    Поясню, что я имел в виду.
    Сначала немного истории в вольном изложении :)

    Давным-давно, когда компьютеры были большими, а гибкие диски действительно гибкими...
    Занимались сотрудники интела разработкой супер-пупер крутого кристалла для процессора 8086. И уже почти вся архитектура была сваяна, как вдруг, некто Джон хлопнул себя по лбу и сказал: "Мужики, а прерывание для отладчика надо было бы сделать однобайтовым! Как у нас это CD 03 на границе сегмента будет работать, а?" Почесали репу мужики и ответствовали: "Не беда, мы сейчас в декодер команд добавим однобайтовый опкод СС. Ну а внутрях будет она делать тоже самое, что и CD 03". И сделали 2 разных опкода для одного аппарного действия....

    Вот так оно "получилось". А действительно разными CC и CD 03 стали лишь в более старших процессорах с появлением протектед-моды и сопутствующих ей прелестей. Вот тогда Интел и стал с гордостью говорить: "Так и задумано" :)
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Gray
    Нет, именно так и задумывалось. Причины две.
    Первая, идеологическая - 64-битный режим введен в первую очередь для увеличения размера адресуемой памяти, а вот размера операнда в 32-бита вполне хватает для подавляющего числа задач. Поэтому в 64-битном режиме размер операнда по умолчанию по прежнему равен 32 битам и соот-но для адресации 64-битных регистров (включая расширенные R8-R15) юзаются префиксы REX, "злоупотребление" которыми может привести к заметному увеличению объема программы, и соотв-но не рекоменудется юзать 64-битные и расширенные регистры без особой на то необходимости.
    Вторая, техническая - сохранение старших битов при изменении частичных (partial) регистров в современных компах (с их out-of-order исполнением и переименованием регистров) является серьезным гемором и решается по разному. В P6 (включая Core 2) для операций с частичными регистрами отводятся отдельные темп-регистры и старшие части просто игнорируются (лежат в своих темп-регистрах) до тех пор пока операция не уйдет в отставку - отсюда с одной строны отсутствие ложной зависимости младших частей от старших, а с другой стороны серьезные штрафы (partial register stall), если после частичного изменения сразу происходит обращение к целому. P4 и атлоны на каждой частичной операции копируют старшие биты из целого регистра, что требует доп."телодвижений" и вводит ложную зависимость части от целого. Посему в 64-битном режиме решили отказаться от этой "порочной практики" и при операциях с младшими 32-битами не гонять каждый раз неиспользуемые старшие 32-бита, а просто обнулять их. В свете рассмотренной выше "32-битной идеологии 64-битного режима" это является вполне логичным и оправданным

    PS: "Загрузить другой функциональностью" xor rax,rax нельзя, т.к. он отличается от xor eax,eax только префиксом, также как и xor ax,ax
     
  13. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Gray
    о CC и CD 03,
    скорее всего они уже после придумали повесить breakpoint на прерывание.
     
  14. Gray

    Gray New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2004
    Сообщения:
    75
    Адрес:
    Russia
    leo
    Очень убедительные резоны. Даже спорить не хочется :) Спасибо.

    t00x
    Как подсказывает мне моя склеротическая память, брекпоинт на прерывании был и в еще более древних процессорах... чуть ли не в 8080.
     
  15. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    какое сказочное совпадение