2013-03-21 5 views
0

PCI 주소를 구성하고 싶습니다. 어셈블리 언어로 EAX (AX가 아님)에 16 비트를 어떻게 쓸 수 있습니까 ?? 예 : 0b1000000000000001최고 16 비트 EAX

EAX before 
|_____16-bit_____||_______AX_______| 
EAX after: 
|1000000000000001||_______AX_______| 

감사 쓰기!

+0

EAX는 전체 32 비트로만 액세스 할 수 있으므로 값. –

+0

마스크 된 값 ('10000000000000010000000000000000'과 같은 것)으로 'OR'하는 것은 어떻습니까? – Linuxios

+0

'OR '은 결정의 하나이지만, 스택에 대해서는 무엇을 사용합니까? – Vanzef

답변

3

그것은 높은 16 비트에 액세스 할 수 없습니다,하지만 당신은 약간의 트릭을 사용할 수 있습니다 : 이것은 당신이 하위 16 개 비트를 파괴하지 않고 원하는 값으로 상위 16 개 비트를 설정

push ax 
mov  ax, 1000000000000001b 
shl  eax, 16 
pop  ax 

합니다.

3

여기에는 여러 가지 방법이 있습니다. 로 (하드 코딩 된 값을

 
rol eax,16    ; rol/ror 
mov ax,0b1000000000000001 
rol eax,16    ; rol/ror 

: 좌우로 회전

 
push eax 
mov [esp+2],word 0b1000000000000001 ; some assemblers want word ptr 
pop eax 

은, 스택이 필요하지만,하지 않는 것이 플래그를 수정 : 스택을 사용하여

, 플래그를 수정하지 않습니다 질문에서) or/xor/add과 함께 and을 사용할 수도 있습니다. 하드 코드되지 않은 값의 경우이 메서드를 사용하려면 다른 레지스터 나 메모리에서 값을 이동해야합니다.

 
and eax,0x0000ffff 
or eax,0x80010000  ; or/xor/add 
+0

감사합니다. 어떤 변종이 더 좋습니다 (더 빠름)? – Vanzef

+0

@Vanzef 하드 코딩 된 값의 경우 마지막으로 가정합니다. 기타는 3 개의 명령어가 있으며 모든 명령어는 이전 명령어의 결과에 따라 달라 지므로 동시에 실행할 수 없습니다. 마지막'and','or' 솔루션은 명령어가 2 개 뿐이므로 일반적으로 가장 빠른 방법이라고 생각합니다. – nrz