ASM 기능의 속도를 향상시키기 위해 SSE 명령어를 사용하려고합니다. 이 함수는 실제로 비트 맵의 음수를 수행합니다. SSE가없는 코드에서 바이트 배열과 배열 크기를 가져옵니다. 그리고 그것은 완벽하게 작동합니다, 비트 맵의 부정을합니다.ASM 기능의 SSE 명령어
;-------------------------------------------------------------------------
.586
.MODEL flat, stdcall
OPTION CASEMAP:NONE
INCLUDE include\windows.inc
INCLUDE include\user32.inc
INCLUDE include\kernel32.inc
.CODE
DllEntry PROC hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
ret
DllEntry ENDP
;-------------------------------------------------------------------------
Negatyw24 PROC stdcall uses eax ebx ecx edx, tab :dword, amount :dword
mov EAX, tab ;kopiuj adres 1 komorki
add EAX, amount ;dodaj ilosc komorek
sub EAX, 1 ;przjedz do ost komorki
petla:
mov BL, [EAX] ;pobierz komorke do rej
mov CL, 255 ;laduj FF do CL
sub CL, BL ;neguj bajt w BL
mov [EAX], CL ;zapisz zaneg bajt do pao
cmp EAX, tab ;sprawdz koniec tablicy
je koniec
sub EAX, 1 ;przesun sie w tablicy o 1 komorke do tylu
jmp petla
koniec:
ret
Negatyw24 ENDP
;-------------------------------------------------------------------------
END DllEntry
이제는 동일한 작업을하지만 MMX 레지스터를 사용하려고했습니다. 나는 이런 식으로 몇 가지 다른 방법을 시도했지만 아무 것도 효과가 없었다. 누군가 이걸로 나를 도울 수 있습니까? 실제 코드는 다음과 같습니다.
;-------------------------------------------------------------------------
.686
.mmx
.xmm
.MODEL flat, stdcall
OPTION CASEMAP:NONE
INCLUDE include\windows.inc
INCLUDE include\user32.inc
INCLUDE include\kernel32.inc
.CODE
DllEntry PROC hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
ret
DllEntry ENDP
;-------------------------------------------------------------------------
Negatyw24 PROC stdcall uses eax ebx ecx edx edi esi, tab :dword, amount :dword
mov EAX, tab ;adres początku tablicy
add EAX, amount ;dodaj ilosc komorek
sub EAX, 1 ;przejdz do ostatniej komorki
mov EBX, 112 ;ilosc bajtow przeksztalcanych w jednym cyklu MMX
pcmpeqd xmm0, xmm0
; -----------------------
; Petla negowania z SSE -
; -----------------------
petlaSSE:
cmp EAX, tab ;jesli zostalo mniej niz 112 bajtow
je koniecSSE ;to koniec instrukcji SSE
movaps xmm1, [EAX]
;movaps xmm1, [EAX-1]
;movaps xmm1, [EAX-2]
;movaps xmm1, [EAX-3]
;movaps xmm1, [EAX-4]
;movaps xmm1, [EAX-5]
;movaps xmm1, [EAX-6]
pxor xmm1, xmm0 ; zanegowanie wartości rejestrów
;pxor xmm2, xmm0
;pxor xmm3, xmm0
;pxor xmm4, xmm0
;pxor xmm5, xmm0
;pxor xmm6, xmm0
;pxor xmm7, xmm0
movaps [EAX], xmm1
;movaps [EAX-1], xmm2
;movaps [EAX-2], xmm3
;movaps [EAX-3], xmm4
;movaps [EAX-4], xmm5
;movaps [EAX-5], xmm6
;movaps [EAX-6], xmm7
sub EAX, 7 ;zmniejszenie komorek o 7
jmp petlaSSE
koniecSSE:
ret
Negatyw24 ENDP
;-------------------------------------------------------------------------
END DllEntry
_ "아무 것도 작동하지 않음"_을 정의하십시오. 어떤 방법으로 작동하지 않습니까? 결과가 예상 한 것과 어떻게 다릅니 까? 디버깅 측면에서 무엇을 했습니까? – Michael
자신 만의 많은 작업을하고 있습니다. C에서이 작업을 수행하고 필요할 경우 SSE 내장 함수를 사용할 수 있습니다.이 작업을 수행하는 것보다 슬픔의 10 % 정도는 비슷한 성능을 얻을 수 있습니다. asm. –
"아무것도 작동하지 않는다"는 것은 "문제가 정렬 된로드에서 잘못 정렬 된 주소라고 말하지 않는 이상한 오류가 발생했습니다"라는 의미입니다. 그러나 이것이 문제였습니다. 'sub eax, 7'에 의해 보장 된 첫 번째 또는 두 번째 중 하나가 잘못 정렬되었습니다. – harold