2016-12-31 1 views

답변

0

를 사용하여 아래의 조립 작업을 다시 쓸 수있는 방법. 그냥 eax을 제로, 그 후 ax을 설정

XOR EAX, EAX 
MOV AX, [short_temp] 

당신이 [EAX]에서 단어를 가져올 경우 here을 말했듯이, 단지 사전에 다른 레지스터에 주소를 저장 : 경우,

MOV EBX, EAX 
XOR EAX, EAX 
MOV AX, [short_temp] 

또는 그게 가능하지, AND를 사용 @fuz proposed으로 수행하고 EAX의 상위 16 개 비트를 지우 :

MOV AX, [EAX] 
AND EAX, FFFFh 
+0

@Downvoter이 문제가 무엇인가요? – Downvoter

+1

나는 당신을 downvoted하지 않았습니다,하지만 이것은'XOR' 명령어를 사용하기 때문에 OP의 요구 사항을 충족시키지 못합니다. – fuz

+0

만약'movzx \t eax, WORD [eax]' –

4

movzx을 피할 필요가 없습니다. EAX와 같은 32 비트 레지스터를 사용할 수있는 경우 코드가 386 이상에서 실행되므로 movzx도 지원됩니다.

인텔 CPU에서 가장 효율적인 방법입니다. movzx r32, [memory]은 ALU 연산없이로드 uop 만 디코딩합니다. 대기 시간은 일반로드 (IIRC)와 같으므로로드 장치에 의해 0 확장이 무료로 수행됩니다.

AMD Bulldozer 계열 CPU에서 movzx은 항상 ALU 포트 (메모리 피연산자 일 때로드 포트는 물론)를 사용하므로 단어로드를 사용하기 전에 이론적으로 EAX를 xor-zero로 빨라질 수 있습니다 (@ Downvoter 's answer). 이렇게하면 코드 크기가 커지고 프론트 엔드가 디코딩 할 때 더 많은 m-ops의 비용으로로드 사용 대기 시간을 1 사이클 낮출 수 있습니다.

부분적으로 레지스터 쓰기 (AX)를 한 후 EAX를 읽거나 다른 대기 시간을 추가하는 별도의 ALU 연산이기 때문에 AX에 워드로드를 수행 한 다음 and eax, 0xFFFF과 같은 다른 제안이 명백히 나 빠졌다. (xor-zeroing avoids the partial-register penalty, 인텔 P6 계열 CPU에서도 마찬가지입니다.)

관련 문제