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

Discussion in 'WASM.X64' started by t00x, Sep 29, 2009.

  1. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    выполняется на 7ке 64x такой кусок кода (выдрал из консольного приложения), компилировал и в 32х и в 64х.
    Code (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

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    P.S. проверил на XPSP3 - получается тоже самое...
    рано удивился ;(
     
  3. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    какое интересное вычитание
     
  4. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    до этого edx не влиял :dntknw:
     
  5. dermatolog

    dermatolog Member

    Blog Posts:
    0
    Joined:
    Feb 3, 2005
    Messages:
    406
    Location:
    Екатеринбург
    t00x
    Code (Text):
    1. sub eax, [main_time1]       ; вычисляем разность
    2. sub edx, [main_time0]
    64-х битные числа так не вычитаются. Сначала вычитаются нижние части (EAX), а потом верхние с заемом:
    Code (Text):
    1. sub eax, [main_time1]       ; вычисляем разность
    2. sbb edx, [main_time0]
    P.S. В main_time0 логичнее писать EAX, т.к. это нижняя часть счетчика