Yes, of course. Most programs are still 32 bit and run fine on 64-bit Windows systems. Those programs are machine language, which has a one-to-one mapping with assembly (and can be easily disassembled into x86 assembly code).
Is it possible to work with x86 assembly on a x64 operating system? Will it run properly in the emulator?
Yes it is possible & it will run properly. Instruction Set Architecture is always backwards compatible.
Registers in x86-64:
For example:
Here you can see that rax
is the new 64 General Purpose register but you still can use eax
as it refers to lower 32 bits of rax
.
Or should I learn x64 assembly?
x86-32 architecture is subset of x86-64. Its like first you learnt x86 then go & find whats new in x86-64 assembly. Once you learn x86 asm. Then this will be a useful resource: http://www.cs.cmu.edu/~fp/courses/15213-s06/misc/asm64-handout.pdf
I'd like to freeload a bit on this question (seems quite relevant and non-hijacking to do so): there are lots of resources for x86-32 out in the world. It seems like there is not very many differences between 32/64 at the assembly level. Considering the wealth of 32 material, is it worth ferreting out the 64 resources and really just concentrating on 64 at this point (assuming one wants to learn 64) or, since it (at least seems) that the important conceptual stuff is all in 32 and only things such as 64 bit registers are really important that it's just fine limiting myself to 32 for just casual educational purposes.
In other words, are there any substantial instuction set differences that would be materially different in 64 vs 32?