Как поменять флаг Z?

Тема в разделе "WASM.ASSEMBLER", создана пользователем yureckor, 30 июн 2005.

  1. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    как сделать subj по красивей?

    Сейчас по тупому:
    Код (Text):
    1.  
    2. ;eax=0
    3. .if eax==[ne_lc]
    4.  CP edi, edx, Z, @@j_end
    5. .else
    6.  CP edi, edx, NZ, @@j_end
    7. .endif
    8.  
     
  2. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    пока придумал так (портит регистры ebx, ecx, но в данном случае он не нужен):
    Код (Text):
    1.  
    2.     ;eax=0  
    3.     mov ecx, edi
    4.     sub ecx, edx
    5.     mov ebx, ecx
    6.     or ecx, [ne_lc]
    7.     jz @@j_end
    8.     cmp eax, [ne_lc]
    9.     jz @@F
    10.     test ebx, ebx
    11.     jnz @@j_end
    12.     @@:
    13.  
     
  3. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Не понял твой вопрос, тебе надо поменять флаг ZF?

    Если да, то, например, так:



    Установить флаг ZF:

    cmp reg, reg



    Сбросить флаг ZF:

    Например, or esp, esp
     
  4. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    _BC_

    да это ясно, как его по хорошему обратить?
     
  5. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Хм...



    pushfd

    xor byte ptr [esp], 40h

    popfd
     
  6. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Можно с SAHF/LAHF, если eax не жалко.
     
  7. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    Код (Text):
    1.  
    2. setz al
    3. test al,al
    4.  


    :)
     
  8. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    самый первый пример поменялся на
    Код (Text):
    1.  
    2.     ;PD [ne_lc]=0/-1
    3.     cmp edi, edx
    4.     setnz cl
    5.     xor cl, PB [ne_lc]
    6.     and ecx, 1
    7.     jz @@j_end
    8.  
     
  9. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Zufyxe

    Портит другие флаги...



    yureckor

    Ты бы объяснил толком, что именно требуется (только без HLA-макросов).
     
  10. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Да собсно проблема разрешилась.

    Что требовалось см. 1-ый пост, т.е. необходимо сверить edi и edx с учетом DWORD'а [ne_lc] (0 или -1)

    Ну и в одном случае перейти если они равны, в другом- если не равны.

    На Спеке я раньше такое решал самоизменяющимся кодом: обычно переменных было дохрена, а переходов еще раза в 4 больше. Сперва все настраивал (менял JP Z / JP NZ или JP C / JP NC) а потом запускал.