We've come full circle and are back to translating as86 code, eh?
"lmsw" is an instruction, "load machine status word". Kind of a 286 thing, but I guess it'll still work. I'd just use cr0:
mov eax, cr0
or al, 1
mov cr0, eax
I translated "jmpi" in your very first as86 example as "jmp go:BOOTSEG". That was incorrect. Should have been "jmp BOOTSEG:go"! You asked me why my code didn't work? That's one of the reasons (there may be more!). Here, you want "jmp 8:???" - if you've loaded your kernel to 0x10000, "jmp 8:0x10000" perhaps. Or "jmp 8:start32" if you've got a label...
I guess your code descriptor is okay... I don't know why you want an 8-meg limit... A "flat memory model" usually uses a base of zero and a limit of 4G-1 for each descriptor.
Your gdt needs to consist of, at minimum, a null descriptor, a code descriptor, and a data descriptor. The null descriptor is never used - can be zeros, but often the "gdt pointer" (you're apparently calling it "lgdt_48" - "gdtr" is a commonly used name) is stored there, just to save a few bytes. Leaving it separate is probably clearer. This six-byte area consists of two bytes of "size" (0x7FF does not look correct to me), followed by four bytes of address. The as86 code needs 0x7C00 in there, since it was assembled at "org 0" (if I understand it correctly). Since, I understand, you've got "org 0x7C00", you shouldn't need any adjustment here. This is a "linear" address - doesn't involve a segment - unlike almost every other address you'll encounter on x86. Nasm syntax to load it would be:
lgdt [lgdt_48]
You do need the "[]"!
I seriously doubt if you want to assemble your bootsector as "-f obj"! I still haven't downloaded that Linux 0.12 code. I suspect that what they're doing is either feeding ld86 with a "linker script", or doing something like "-T.text=0x0" on the command line to ld86. Take a look at their Makefile to find out. If you wanted to emulate that, Nasm has a "-f as86" output format which might be useful (I've never used it - it does accept "..start", according to the manual). I would suggest assembling with "-f bin". "-f obj" won't accept "org", and "-f bin" won't accept "..start", so it'll make a difference! Alink may be able to combine several OMF objects to a binary image, but I don't know how to do it (or even if it's possible). I'd stick to "-f bin".
Anyway, "lmsw" is an instruction...
Best,
Frank