The main problem is probably the "jmp 0x1000", which (depending on what CS is) possibly jumps to 0x0000:0x1000 (physical address 0x00001000) but could jump to 0x007C0:0x10000 (physical address 0x00008C00) or somewhere else. You loaded the sector at "0x1000:0x0000" (or physical address 0x00010000), so it's almost impossible for the jump to be right. Instead, you need a "far jump" like "jmp 0x1000:0x0000" that sets CS and IP (and doesn't just set IP and leave CS as whatever the BIOS felt like).
Other problems are:
a) the correct device number to use (in dl when you ask BIOS to load a sector) is whatever the BIOS told you the correct device number is (in dl when your code was started)
b) The BIOS could have left the stack (SS:SP) almost anywhere, which includes leaving the stack at the same address you overwrite when loading a sector. This means that there's a chance that loading a sector will trash the stack (while the BIOS is using it) and cause the BIOS to crash. You need to set SS:SP to something that won't cause problems before you do anything with any other memory. Note that your code sets SS without setting SP (which is also a mistake) and does that too late.
c) If a BIOS function like "int 0x13, ah=0x02" fails the BIOS tells you an error code (in ah). It's extremely important to use that error code to inform the user of what went wrong so that they can fix the problem (e.g. so they can determine if it's a software problem or a hardware problem) and aren't stuck with a computer that won't boot and no clue why. This also helps developers (you) find and fix bugs. This means using the error code to find an error string and then printing the error string. Unfortunately it's impossible to get good error handling in 512 bytes (the strings take up too much space); but you can easily fit "better than nothing" error handling in 512 bytes (e.g. print a raw hex code at the end of a generic string, like maybe "ERROR: Failed to load sector, BIOS error code 0x02" followed by "Boot aborted").
d) Floppy disks were notoriously unreliable; so standard practice was to retry (at least) 3 times before you assume an error is valid, while asking BIOS to reset the disk system ("int 0x13, ah=0x00") between (some) retries.
e) The hlt instruction does not stop the CPU forever - it merely asks the CPU to wait until an IRQ occurs (and for BIOS, IRQs from timer alone typically happen 18.2 times per second). This means that instead of the CPU stopping at your hlt it will continue executing code after the hlt (likely causing your code to print random garbage and then do a "return to undefined address because the routine wasn't called normally" and likely crash). To fix that use a loop; like ".die:", "hlt" then "jmp .die".
f) Floppy disks have been obsolete for about 20 years. For hard drives you have to deal with some kind of partitioning system and your boot loader won't/can't begin in the first sector of the disk. Instead, your boot loader will begin in the first sector of a partition.
g) BIOS should also be considered obsolete (replaced by UEFI). Even though BIOS still exists on old computers now, it won't exist on old computers when you finish writing an OS. For this reason it's better to learn about UEFI (and not bother learning about BIOS).
Note: If you are using BIOS, then it's better to rely on Ralph Brown's Interrupt list for documentation of BIOS functions. You can find that at http://www.ctyme.com/rbrown.htm (but you'll typically want the table of interrupts at http://www.ctyme.com/intr/int.htm ).
jmp 0x1000:0as suggested in the answer, you also should add the following lines: 1. Afterorg 0x7C00the linesection BOOTSECTOR start=7C00hand 2. afterdw 0xAA55the linesection KERNEL follows=BOOTSECTOR vstart=0-- this will insure that themov si, testStringuses the correct offset. - ecm