Instrucciones de la CPU de referencia (justo antes de cargar el sistema operativo): XCHG vs XOR, XOR, XOR

1.225.000 - promedio para XCHG (izquierda), 1.280.014 - promedio para XOR, XOR, XOR (derecha)
1.225.000 - promedio para XCHG (izquierda), 1.280.014 - promedio para XOR, XOR, XOR (derecha)

, XCHG RISC x86 CISC? , , "X" "Y", , "Z".



X=5, Y=7

Z=Y

Y=X

X=Z

X=7, Y=5



, XCHG, , ...



X=5, Y=7

XCHG X, Y

X=7, Y=5



"XCHG", "XOR CHANGE", . XOR CHANGE? XOR.



X=5, Y=7

XOR X, Y

XOR Y, X

XOR X, Y

X=7, Y=5



, , "XCHG" "XOR, XOR, XOR". , - , .. , . , MBR ( ).

El siguiente código repite la instrucción "XCHG EDI, EAX" 7 veces y la instrucción "XOR" 21 veces y acumula los tics del procesador gastados. El ciclo de cada comando probado se repite 10.000 veces. Después de eso, todo esto se desplaza una y otra vez (20 veces en total), como resultado, se calcula el promedio. En cuanto a mí, la prueba es bastante "limpia", más o menos determinista. Bueno, en cuanto a si el comando XCHG y los tres comandos XOR son iguales en términos de duración de ejecución, a juzgar por esta prueba, XCHG se ejecuta un 5% más rápido, lo que no encaja en mi teoría :)





      +    
             mov      ax, 3
             int      10h
             cli                            ;  
             mov      al, 0FFh
             out      021h, al
             out      0A1h, al
             mov      cx, 20                ;  20 
again:       push     cx
             xor      ebp, ebp
             mov      si, 10000             ;  10000   XCHG
@@:          xor      eax, eax
             xor      edi, edi
             cpuid                          ;      
             rdtsc
rept 7     { xchg     edi, eax }            ;  7  XCHG
             cpuid
             rdtsc
             sub      eax, edi	            ;  
             add      ebp, eax              ;  
             dec      si
             jnz      @B
             mov      [_xchg], ebp          
             xor      ebp, ebp
             mov      si, 10000             ;  10000   XOR
@@:          xor      eax, eax
             xor      edi, edi
             cpuid
             rdtsc
rept 7     { xor      edi, eax              ;  7    XOR
             xor      eax, edi
             xor      edi, eax }
             cpuid
             rdtsc
             sub      eax, edi
             add      ebp, eax
             dec      si
             jnz      @B
next:        mov      [_xor], ebp
             mov      eax, [_xchg]
             add      [totalxchg], eax
             mov      di, [screen]
             call     print
             add      word [screen], 32
             mov      eax, [_xor]
             add      [totalxor], eax
             mov      di, [screen]
             call     print
             add      word [screen], 128
             pop      cx
             dec      cx
             jnz      again
             dec      byte [color+1]
             mov      eax, [totalxchg]
             mov      ebx, 20
             xor      edx, edx
             idiv     ebx
             mov      di,[screen]
             call     print
             mov      eax, [totalxor]
             mov      ebx, 20
             xor      edx, edx
             idiv     ebx
             add      word [screen], 32
             mov      di,[screen]
             call     print
@@:          jmp      @B                ;   .
print:       mov      ebx, 10           ;      
             xor      cx, cx
more:        mov      si, bufferdec+12
             xor      edx, edx
             sub      si, cx
             idiv     ebx
             add      dl, '0'
             mov      [si], dl
             inc      cx
             test     cl, 1
             je       @F
             test     cl, 2
             je       @F
             or       eax, eax
             je       @F
             mov      [si-1], byte '.'
             inc      cx
@@:          or       eax, eax
             jne      more
color:       mov      ah, 7
             push     0b800h
             pop      es
             mov      si, bufferdec+12
             add      di, cx
             add      di, cx
             std
@@:          lodsb
             stosw
             loop     @b
             push     cs
             pop      es
             ret
screen:      dw 0
_xchg:       dd 0
totalxchg:   dd 0
_xor:        dd 0
totalxor:    dd 0
bufferdec:   db 12 dup 0

rb 510 - ($ - $$)
db 55h,0AAh  
      
      






All Articles