выполнение в 64х среде

Тема в разделе "WASM.X64", создана пользователем t00x, 29 сен 2009.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    выполняется на 7ке 64x такой кусок кода (выдрал из консольного приложения), компилировал и в 32х и в 64х.
    Код (Text):
    1.     ;---------------------------- counter0
    2.     xor eax, eax
    3.     mov [main_time0], eax
    4.     mov [main_time1], eax
    5.     mov eax, 0x80000001
    6.     cpuid
    7.     rdtsc
    8.     mov [main_time0], edx
    9.     mov [main_time1], eax
    10.     ;---------------------------- counter0
    11. mov eax, [x]           ;
    12. xor edx, edx           ; mul!
    13. add eax, [y]           ; eax = x + y
    14. mov ebx, eax
    15. sub eax, 1         ; (x + y - 1)
    16. sub ebx, 2         ; (x + y - 2)
    17. mul ebx
    18. shr eax, 1         ; /2
    19. add eax, [y]           ;
    20. mov [z], eax
    21.     ;---------------------------- counter1
    22.     clc
    23.     rdtsc               ; снова читаем счетчик
    24.     sub eax, [main_time1]       ; вычисляем разность
    25.     sub edx, [main_time0]
    26.     mov [main_time1], eax
    27.     mov [main_time0], edx
    28.     sub eax, 105            ; Pentium 4 D
    29.     ;---------------------------- counter1
    30.  
    31. main_time0 dd 0
    32. main_time1 dd 0
    33. x dd 0
    34. y dd 0
    35. z dd 0
    после выполнения eax = 0 (иногда 0xE).
    а если закомментировть саму процедуру подсчета z, результат в eax абсолютно аналогичный (0 или 0xE).
    так быстро считает?
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    P.S. проверил на XPSP3 - получается тоже самое...
    рано удивился ;(
     
  3. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    какое интересное вычитание
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    до этого edx не влиял :dntknw:
     
  5. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    t00x
    Код (Text):
    1. sub eax, [main_time1]       ; вычисляем разность
    2. sub edx, [main_time0]
    64-х битные числа так не вычитаются. Сначала вычитаются нижние части (EAX), а потом верхние с заемом:
    Код (Text):
    1. sub eax, [main_time1]       ; вычисляем разность
    2. sbb edx, [main_time0]
    P.S. В main_time0 логичнее писать EAX, т.к. это нижняя часть счетчика