JP вместо JE

Тема в разделе "WASM.ASSEMBLER", создана пользователем lotte, 9 дек 2004.

  1. lotte

    lotte New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2004
    Сообщения:
    4
    Уважаемые медитирующие!

    Подскажите, пожалуйста, наивному чукотскому монаху.

    Пишу для MASM, использую je, jne.

    Загружаю дебаггер msdevenv.exe (VS 7.0)

    получаю в disassembly непонятно откуда взявшийся

    jp ...



    Объясните доходчиво, пожалуйста.
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    некоторые условия дублируются для удобства программера: je и jz имеют одинаковый опкод, иначе, есть одно и тоже, а отладчик не знает ход мысли программиста, и выводит тот опкод, который решили разработчики отладчика. просто это нужно учитывать. а вот почему jp вместо je - не могу сказать точно, но масм может оптимизировать прогу, то есть, ты можешь увидеть в отладчике не то, что писал. но с этим я пока не сталкивался, может, кто другой расскажет больше.
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    покажи кусочек кода, где ты с этим сталкиваешься
     
  4. lotte

    lotte New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2004
    Сообщения:
    4
    Упс!

    Вот это переглючило мои рецепторы!

    На самом деле я все наврал....



    Привожу код.

    Пишу:

    cmp [esi], dl

    jpe EndOfParsing

    Получаю:

    00401064 cmp byte ptr [esi],dl

    00401066 jp 004010A2



    То есть JPE превращается в JP, что вполне нормально.

    А я то думал, я пишу JE....... вот как оно бывает то, с непривычки... :dntknw:
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    MASM ничего не оптимизирует. FASM - другое дело.
     
  6. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Quantum



    Если память не изменяет FASM не оптимизирует код. Единственное, что он делает это проставляет ближние и дальние переходы так, что бы код получился меньше. ИМХО.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    pas

    Когда-то точно оптимизировал, вспомним хотя бы шумиху вокруг оптимизации test :derisive:
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Любой нормальный ассемблер оптимизирует код по размеру. Одно- и 2х- проходные не в состоянии, конечно, выбрать короткие варианты инструкций переходов. Но для арифметики выбирается минимальныё опкод:
    Код (Text):
    1.  
    2. 81C0 22000000 add     eax, 22
    3. 05 22000000   add     eax, 22
    4. 83C0 22       add     eax, 22




    С test конечно несколько сложнее, поскольку есть три взаимно противоречивые вещи: оф.документация, правила математики и здравый смысл :))))



    ЗЫ: Не так давно обнаружил, что intel C++ compiler "не догадывается" заменить команды вида
    Код (Text):
    1. 8D0424        lea     eax, [esp]
    на
    Код (Text):
    1. 8BC4          mov     eax, esp
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Кстати, я тут интересную вещь обнаружил, Olly при ассемблировании оптимизирует по размеру, т.е. делает несколько тестов ассемблирования и выбирает наименьший по размеру вариант.