NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: nobody on November 20, 2008, 08:46:21 PM
-
Hello !
(also posted in Beginner Questions Forum, but no answer to latest update)
I have the following problem (using SUSE LINUX 11 with NASM version 2.05.01 compiled on Nov 7 2008, LATEST).
I program 64bit assembly code and the following code does not execute properly after code generation with nasm:
mov r9,[memoryvalue] = 08900000000000089h
and r9,0ff00000000000000h
yields 0x0 in r9
--> incorrect !
This code works fine, but not the way I want it:
mov r9,[memoryvalue]
mov rax,0ff00000000000000h
and r9,rax
yields 0x089 in r9
--> correct
Could someone please fix it.... starting to use this command more often and it becomes annoying to
use the additional register.
Many thanks
Bjoern
-
... and
the cmp command does not compile either.
e.g.
cmp rcx,0900 0000 0000 0000h
--> error (compiles with warning, but debugging shows that it's not like above)
only
mov rax,0900 0000 0000 0000h
cmp rcx,rax
works.
Thanks,
Bj
-
Check out either the AMD64 or Intel Architecture manuals -- the only instruction that supports a 64bit immediate operand is MOV. AND & CMP (and any other instructions) take only 32bit immediate operands at most, even when using the 64bit forms of those instructions. So this is why your examples that use MOV to load the 64bit immediate work, but the others do not.
Were you getting any warnings when compiling? If not maybe you should put in a request to the NASM people (not me :) to have some sort of warning emitted when using a 64bit immediate on anything other than MOV.