Почему? Вопрос по Ведению в машинный код и программированию под ДОС

Тема в разделе "WASM.BEGINNERS", создана пользователем MayBe, 7 окт 2006.

  1. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Во-первых, респекты авторам сего труда.
    Вот вопрос... почему так:
    Код (Text):
    1. ----------------------------
    2. MAIN proc
    3.   xor AL,AL
    4.   mov BH,10h
    5.   mov CH,5
    6.   mov CL,10h
    7.   mov DH,10h
    8.   mov DL,3Eh
    9.   mov AH,6
    10.   int 10h
    11.   call WINDOW
    12.   call WINDOW
    13.   call WINDOW
    14.   call WINDOW
    15.   int 20h
    16. MAIN endp
    17.  
    18. WINDOW proc
    19.   ADD BH,10h
    20.   ADD CH,1
    21.   ADD CL,1
    22.   SUB DH,1
    23.   SUB DL,1
    24.   INT 10h
    25.   RET
    26. WINDOW endp
    27. --------------------------
    28. почему не пишут так... (ведь.. вроде байт экономиться %)
    29. MAIN proc
    30.     mov AX,0600h
    31.     mov BH,10h
    32.     mov CX,0510h
    33.     mov DX,103Eh
    34.     int 10h
    35.     call WINDOW
    36.     call WINDOW
    37.     call WINDOW
    38.     call WINDOW
    39.     int 20h
    40. MAIN endp
    41.  
    42. WINDOW proc
    43.     ADD BH,10h
    44.     ADD CX,0101h
    45.     SUB DX,0101h
    46.     INT 10h
    47.     RET
    48. WINDOW endp
    49. --------------------------
    Не понятно зачем писать XOR если понятней MOV???
    И почему CH,CL а не сразу CX... и AX..., и DX...????
    Я интуитивно чувствую что для читабельности XOR дань традиции, но требуется мнение Мастера ДЗЭН))))
    Без этого вся медитация ломается после сокрушения пустоты)))))
    Заранее спасибо
     
  2. afybc

    afybc New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2006
    Сообщения:
    73
    Если ты имеешь ввиду почему
    Код (Text):
    1. xor reg,reg
    вместо
    Код (Text):
    1. mov reg,0
    то взгляни на машинный код и ты все поймешь

    А на счёт
    Думаю это для того чтобы понятно было.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Он и так всё понял =)
    В общем ты прав, ни по размеру кода ни по скорости первый пример не лучше, даже хуже, зато читать проще. =)
     
  4. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Я тупой.... поэтому не понял...)))) Приношу свои извинения за въе*ливость
    XOR это же логическая операция сравнения.... или/или... которая даёт 0 если операнды равны???
    Нихрена не понял, извините....
    Зачем вообще включать в незатейливую программульку логическую операцию???
    Про СX,AX,DX эт понятно...
    но вот XOR выедает мне мозг))))
    посмотрел код, нихрен на понял... т.е. трассировка всеравно начинается с MOV BH,10h
    или я не туда смотрел...
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    xor - логическое или. Но она часто используется для очистки регистра
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Это может только новичкам не понятно, а вообще то это стандартный способ очистки регистра. В общем случае XOR это исключающее ИЛИ, поэтому xor r,r обнуляет регистр r. А в современных суперскалярных компах операции xor r,r и sub r,r к тому же имеют специальную аппаратную поддержку (признак очистки регистра и независимость от его пред.состояния), поэтому mov r,0 практически никто и не использует, тем более в 32-битном коде
     
  7. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Теоретически догнал...))))
    Спасибо
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ужас. Да таких заумных слов типа
    люди не понимают. Я, например, воспринимаю это, как попытку запудрить мозги.
    Нельзя ли сказать проще:
    xor ax, ax - два байта
    mov ax, 0 - три байта.
    (ну и, соответственно, тактов во втором варианте тоже больше будет)
    Вот и все.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    l_inc
    За исключением отдельных специфических случаев число тактов будет одинаково. А вот inc\dec наоборот короче add\sub, но их "почему-то" рекомендуют избегать, а в 64-битном режиме AMD64\EM64T (о, ужас !) их и восве "отменили". Еще пимер test r,r и or r,r имеют одинаковый размер, но для проверки регистра на ноль test предпочтительнее - к чему бы это ;) Объяснять не буду, т.к. "таких заумных слов" отдельные "люди не понимают" ;))
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Просто уметь объяснять, а не уметь показать свои знания, нужно. И причем здесь вообще эта информация? Надо понимать, чтобы повыпендриваться. К тому же не понятно зачем сравнивать test и or. Если не считать, что or кроме флагов меняет еще и значения аргументов (для проверки на ноль действительно считать не надо), то test работает по алгоритму and (хотя приведение сравнения and и test было бы тоже не оправдано, так как вопроса на эту тему не было).
    P.S. Признаю свою ошибку. Тактов действительно одинаково (по одному, как написано в справочнике). :derisive:
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Ну, иногда и такое встречается:
    xor ecx, ecx
    dec ecx

    вместо:
    mov ecx, 0FFFFFFFFh
     
  12. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Ребят... дышите глубже)))
    Всё нормально я действительно понял зачем используется XOR
    Всем спасибо
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    MayBe
    На месте xor eax,eax с таким же успехом можно применить и sub eax,eax и ряд других
     
  14. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Я так и думал... не более чем условность и привычка автора.
    Я не против как человек привык так пусть и кодит... )))
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    l_inc
    Для начала тебе стоило бы заглянуть в правила форума, усвоить правила хрошего тона и научиться отвечать по существу, а не давать психоаналитические оценки другим участникам - здесь не институт психиатрии и не суд присяжных заседателей ;) Если тебя тошнит от слова "суперскалярный", то извини - могу сказать "современный" (хотя что считать современным не понятно, а суперскалярными являются все х86, начиная с Pentium Pro).
    Ну так почему же для очистки регистра рекомедуется использовать xor, а не mov. Ну ес-но потому, что xor в 16\32-битном варианте короче, чем mov (как говориться это и козе понятно ;). Но теперь допустим "мы все учились понемногу..." и где-то что-то слышали о суперскалярности современных компов, о том что они могут выполнять несколько независимых операций параллельно и "аггрессивно" переупорядочивать инструкции так, что последующие независимые операции могут выполняться раньше предыдущих. В этом случае вроде получается, что mov предпочтительнее xor, т.к. mov ни от чего не зависит, а xor в общем случае "вроде как" зависит от установки значения в регистре и "вроде как" не может выполняться одновременно или раньше операций, изменяющих этот регистр. Но добрые дяди из Intel и AMD предусмотрели эту ситуацию и ввели спецподдержку операций xor r,r и sub r,r - процессор считает их независимыми от пред.значения регистра и может выполнять в любой подходяшщий момент, как и mov. Поэтому на современных компах xor r,r возведена в ранг спецоперации для очистки регистра - благодаря малому размеру + спецподдержки со стороны процессора и это кстати подчеркивается во всех мануалах по оптимизации. Можно было бы еще припомнить проблему partial register stall (о, ужас !) в первых компах семейства P6, где xor и sub имеют еще бОльшее значение, т.к. они в отличие от mov r,0 помечают регистр свободным и устраняют большие задержки при чтении AX\EAX после записи в AL\AH. Но все эти "выпендривания" я привожу только ради того, чтобы уточнить - дело не только в размере инструкций, а в том, что в "современных" компах инструкция xor r,r является не просто "логической операцией", а официально узаконенным и рекомедуемым всеми мануалами способом очистки регистра

    PS: Если соберешься ответить, то просьба - поменьше психоаналитики и побольше конструктива ;) "Блистать знаниями" тут не не возбраняется и лишь приветствуется, а за флуд и навешивание ярлыков можно и в персона-нон-грата угодить ;)

    MayBe
    Если ты об использовании xor, то я уже ответил - это общепринятый метод очистки регистра. Не веришь - загляни в мануалы по оптимизации от Intel и AMD
    Если же о раздельной установке AL\AH вместо записи в AX, то да - это причуда автора
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    leo
    Спасибо за интересную и подробную информацию-ликбез. За всем, увы, не уследишь...
     
  17. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Что... это... о... кажется я знаю это чувство....
    Господа... НИРВАНА....
    Исчерпывающий ответ!!! От души благодарен!
    Можно считать что тема закрыта.