Нужна помощь

Тема в разделе "WASM.ASSEMBLER", создана пользователем Dust112, 17 июн 2006.

  1. Dust112

    Dust112 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2002
    Сообщения:
    16
    Адрес:
    Russia
    Помогите, как это #define VID_FROM_REG(val) ((val)==0x1f?0:dntknw:val)>=0x10?510-(val)*10:205-(val)*5) записать на asme. С правой частью понятно, а вот с этой (val)==0x1f?0:dntknw:val)>=0x10? нелады.
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    if( val == 0x1f ) {

    return 0;

    } else {

    if( val >= 0x10 ) {

    return (510 - val * 10);

    } else {

    return (205 - val * 5);

    }

    }
     
  3. cmd_prompt

    cmd_prompt New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Donetsk
    Вот чистый асм:



    mov eax, val

    cmp eax, 1Fh

    jne @@1

    xor eax, eax

    ret



    @@1:

    cmp eax, 10h

    jb @@2

    imul eax, eax, 10

    neg eax

    add eax, 510

    ret



    @@2:

    mov ecx, eax

    shl eax, 2 ; eax=eax shl 2 + ecx быстрее, чем imul eax, eax, 5

    add eax, ecx

    neg eax

    add eax, 205

    ret
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Может лучше так:

    lea eax,[eax*4+eax]
     
  5. cmd_prompt

    cmd_prompt New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Donetsk
    Да, действительно, должно быть быстрее, спасибо за замечание! Забыл про lea, что сделаешь, старость не радость. :) Тогда и вместо imul eax, eax, 10 лучше написать так:

    lea eax, [eax*4+eax]

    add eax, eax.