Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get the upper half of the EAX register

Tags:

x86

assembly

In x86 assembly language, is there any way to obtain the upper half of the EAX register? I know that the AX register already contains the lower half of the EAX register, but I don't yet know of any way to obtain the upper half.

I know that mov bx, ax would move the lower half of eax into bx, but I want to know how to move the upper half of eax into bx as well.

like image 559
Anderson Green Avatar asked Mar 05 '13 17:03

Anderson Green


4 Answers

If you want to preserve EAX and the upper half of EBX:

rol eax, 16
mov bx, ax
rol eax, 16

If have a scratch register available, this is more efficient (and doesn't introduce extra latency for later instructions that read EAX):

mov ecx, eax
shr ecx, 16
mov  bx, cx

If you don't need either of those, mov ebx, eax / shr ebx, 16 is the obvious way and avoids any partial-register stalls or false dependencies.

like image 181
Alexey Frunze Avatar answered Oct 28 '22 18:10

Alexey Frunze


If you don't mind shifting the original value of bx (low 16 bits of ebx) to high 16 bits of ebx, you need only 1 instruction:

shld ebx,eax,16

This does not modify eax.

like image 21
nrz Avatar answered Oct 28 '22 17:10

nrz


I would do it like this:

mov ebx,eax
shr ebx, 16

ebx now contains the top 16-bits of eax

like image 25
Jason Avatar answered Oct 28 '22 16:10

Jason


For 16-bit mode, this is the smallest (not fastest) code: only 4 bytes.

push eax  ; 2 bytes: prefix + opcode 
pop ax    ; 1 byte: opcode
pop bx    ; 1 byte: opcode

It's even more compact than single instruction shld ebx,eax,16 which occupies 5 bytes of memory.

like image 38
kiasari Avatar answered Oct 28 '22 17:10

kiasari