Question

I want to form a PCI address. How can I write 16-bit to the EAX (not to AX) in assembly language?? Example: write 0b1000000000000001

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

Thanks!

Was it helpful?

Solution 2

It's not possible to access the higher 16 bits, but you can use a little trick:

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

This sets the higher 16 bits to any value you want without destroying the lower 16 bits.

OTHER TIPS

There are many ways to do it, here are some.

Using the stack, doesn't modify any flags:

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

Rotating to left or right, doesn't need stack, but modifies flags:

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

For hardcoded values (as in the question), you can also use and with or/xor/add. For non-hardcoded values you would need to shift the value in some other register or in memory to use this method:

and  eax,0x0000ffff
or   eax,0x80010000       ; or / xor / add
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top