2010-01-24 5 views
0

길이 배수가 8 인 바이트의 벡터가 주어지면 mmx 명령어를 사용하여 어떻게 2를 5로 변환 할 수 있습니까?간단한 조립에 대한 도움 mmx exercise

.data 
v1 BYTE 1, 2, 3, 4, 1, 2, 3, 4 

감사합니다.

편집 : 2와 5는 그 예입니다. 이들은 실제로 프로 시저의 매개 변수입니다.

답변

6

이렇게하려면 여러 가지 방법이있을 것입니다. 예를 들어, 다음 작동해야

1)) 개의 mmx 레지스터 (mm0에서 5의 전체의 마스크 (2 개) 중 제 1 확인 (또는로드 - 다른 MMX 레지스터 등으로 mm7)

2)로드 데이터를 를 사용하여 테스트 할 레지스터 보유 데이터를 2와 비교하십시오. 예 : PCMPEQB를 이용하여이 레지스터의 요소가 2하지

4), (5)의 가진 레지스터에 의해 생성 된 마스크를 선택적으로 5 년대를 작성하는 비교 MASKMOVQ 사용 여부에 따른 FFh의 마스크 00h 될 것이다 이전에 2를 보유한 직위에 MASKMOVQFFh 값을 보유한 마스크 위치에 대한 데이터를 저장합니다.

5) 끝날 때까지 이것을 반복하십시오.

6) 끝에 MMX 상태를 종료하려면 EMMS을 실행하십시오. 루틴이 끝나면 SFENCE 또는 MFENCE 명령도 발행하십시오 (MASKMOVQ은 비 시간적 힌트를 생성하기 때문에).

XMM 대신 MMX를 사용하면 정렬에 대해 걱정할 필요가 없습니다.

편집 : 지침의 세부 사항에 문제가있는 경우 인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서 (2A 및 2B 권)에는 원하는 모든 내용이 포함되어 있어야합니다 알고있다. 당신은 그들 here 찾을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 asnwer에서 2와 5가 단지 하나의 예라고 언급하는 것을 잊었다. 그들은 실제로 프로 시저의 매개 변수입니까? 어떻게하면 프로그래밍 방식으로 마스크를 생성 할 수 있습니까? Btw, 나는 MASKMOVQ보다는 다른 접근법을 찾고 있었다. 더 등 AND, OR, XOR처럼 ... – nunos

+0

(1) 물론, 정말 2의 5의 여부는 중요하지 않습니다. 필요에 따라 그리고 사용 가능한 명령 세트를 기반으로 상수 바이트의 마스크를 생성하는 방법에는 여러 가지가 있습니다. 예를 들어 범용 명령을 사용하여 명령을 생성하고 MOVQ를 사용하여 MMX reg에로드하거나 MOVD를 사용하여 범용 레지스터에서로드 한 다음 PUNPCK .. 또는 PSHUF를 사용하여 1 바이트에서 마스크를 생성 할 수 있습니다. . 지침. (2) 물론 MASKMOVQ가 이미 있기 때문에 PAND와 POR 등을 사용하여 동일한 작업을 수행 할 수 있습니다. 더 간단 할 수도 있습니다. – PhiS