How is data allocated in an assembly language using the instruction set?
This IS allocating the memory, and it has nothing to do with the instruction set.  Assemblers are incredibly simple - the lines in the assembly file correspond almost exactly to the output binary, very little rearranging is done.  The line ".long 0x0" just means 'give me four bytes right here and load them with the value 0x0'.  The data is 'allocated' the same way as instructions.  A line 'MOV R12, R11' just means 'give me four bytes right here and load them with the binary encoding for MOV R12, R11'.  The data is contiguous for the same reason that your instructions are contiguous - you typed them on contiguous lines in the assembly file.  The "va:" just means 'call the location of these four bytes "va"'.  This is only used inside the assembler.  Wherever you reference 'va' in the code, the assembler will insert the address of the four data bytes that 'va' refers to, which is just a number.  Note that this may not be done by the assembler, this may be done by the linker.  However, the string 'va' will never appear in the output binary.  

Basically, assembly is almost a direct representation of the memory contents.  Successive lines of assembly will end up in successive addresses.  The only exception is when you change sections (.section).  Any data explicitly located in the code will be contiguous if it is contiguous in the assembly file.  Now, sections do screw around with this a little bit.  It's possible that everything .data ends up in one part of memory and everything .text ends up in another part.  However, the blocks will not be broken up - if they are contiguous in the assembly file, then they will be contiguous in the output.