Команда DIV, запутался

Тема в разделе "WASM.BEGINNERS", создана пользователем tagegor, 8 июл 2009.

  1. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Здравствуйте, форумчане
    Начал осваивать язык Assembler
    Решил попробовать написать простую программку - кликер(для онлайн игры)
    Для того чтобы задать положение курсора по центру экрана, я делаю так
    .data?
    Код (Text):
    1. .data?
    2. ;CursorData DWORD ?
    3. width_mon  DWORD ?
    4. height_mon DWORD ?
    далее при помощи WinApi
    Код (Text):
    1. invoke GetSystemMetrics,SM_CYSCREEN
    2. mov    height_mon, eax
    3. div    2 ; НЕХОЧЕТ!!!
    Из статьи:
    Как это сделать, и после нужно занести данное значение в перменную :)
    Спасыбо
     
  2. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Двойку сначала надо загрузить в регистр или в ячейку памяти (в описании сказано так)
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Разделить на два

    Код (Text):
    1. ror     dword ptr [height_mon], 1
     
  4. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    лучше shr юзать
    делит число на степень двойки

    1 - делить на 2 (2^1)
    2 - делить на 4 (2^2)
    3 - делить на 8 (2^3)
    ...
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    tagegor

    1. Внимательно прочитать описание команды DIV. У неё очень ограниченный набор возможных операндов. В частности, делимое всегда находится в EDX:EAX, туда же запихивается и результат. Например, в данном случае можно сделать так:

    Код (Text):
    1. mov  edx, старшая часть делимого
    2. mov  eax, младшая часть делимого
    3. mov  ebx, делитель
    4. div  ebx
    2. Если деление производится на число, являющееся степенью двойки (т.е. на 2, 4, 8, 16 и т.д.), его следует заменять командой сдвига вправо на 1, 2, 3, 4 и т.д. разряда. Дело в том, что команды сдвига на современных процах выполняются за один такт, а деление всегда занимает в общем случае десятки тактов: эта команда в принципе не может быть сделана быстрой.
     
  6. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    А не проще? =)

    Код (Text):
    1. push height_mon
    2. push 2
    3. fild dword[esp]
    4. fild dword[esp-4]
    5. fdiv st0, st1
    6. fist dword[esp]
    7. pop result
    8. pop eax
     
  7. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Код (Text):
    1. sar    eax, 1
    ;) вот так сделал