I would suggest the Borland compilers to start with just because the early versions are officially free (turbo pascal 3.01 and 5.5, Turbo C 3.0), the later versions are easy enough to find. On a low memory systems Turbo Pascal 3 is one of the few that can operate in as little as 128k of RAM with a built in editor off a single 360k floppy with room to burn... while more robust versions like turbo pascal 7 remains one of the best compilers ever made for DOS -- even compared to most C implementations INCLUDING Borland's own attempts.
The official Embacardawhateverthehellthey'recalled site is a pain in the ass to download them from, but many sites have them mirrored... RGB Classic games for example:
http://www.classicdosgames.com/utilities/dos.html
Has Turbo C 2.0, Turbo C++ 1.0, and Turbo Pascal 1, 3.01 and 5.5 up. You go to someplace like
WinWorld and they've got every major release up (of dubious legality, but hey...)
It also helps that bitsavers has a Borland directory in which you can download PDF copies of all the manuals:
http://www.bitsavers.org/pdf/borland/
One of the reasons I like the Borland compilers, especially later versions of Turbo pascal is it's so easy to include assembler... In TP3 you had to 'assemble' your own code first for inlining (which sucked) but by the time of TP4 and later it has a ASM directive, which triggers an actual assembler. My
recent game release makes heavy use of that capability as the parts I need fast are all ASM, while I basically use Turbo Pascal as the "glue" to hold it together.
One of the best resources for old-school DOS programming is the SWAG -- sourceware archival group... It's mostly targeting pascal (with some asm laced in)... unfortunately the company that was hosting it online in HTML form was throwing errors, and now seems to have gone down completely. Thankfully there's a downloadable copy available for free on Simtel.
http://www.simtel.net/product/view/id/63036
Even if you're not programming in Pascal, the SWAG contains many easy to understand code examples that are easily ported to other languages.
One way I've 'sped up' my development process for the older systems is to do my preliminary testing in DosBox on my modern machine. If you screw up and crash it, it's a lot nicer (and faster) to be able to just kill DosBox and start up a new copy than to sit there waiting for one of the old systems to reboot. It also lets me use modern editors (I like Crimson Editor, but any good text editor will do) to manage the code, while using the command line versions of TASM, TP and Turbo C to compile and test inside DosBox -- it's much the same process as testing your OS level code for Linux or Windows development inside a VM like VirtualBox... the advantage being you can safely let the host PC have direct access to the directory DosBox is treating as a drive, and crashing the testing environment won't take your editor down with it.
I highly recommend
yhkwong's SVN builds as it has a lot of bugfixes and feels "closer" to the real hardware than the current official binary release... and he throws in a bunch of stuff the main trunk can't include for legal reasons like MUNT, 3dFX Glide emulation, etc. Even has a better rendering tree (the openGL and direct3d modes are absolutely kick-ass)
It also lets one rapidly test multiple configurations -- I've got shortcuts on the desktop for CGA/PC Speaker, Tandy/TandySound, EGA w/CMS, VGA with Adlib/SB and VGA+MUNT. (as my real MT32 shit the bed) . It's also nice to be able to hit ctrl+plus and ctrl+F11/F12 to quickly play with the timings -- un-throttling it for instant compilation and then choking it down to 270 to 280 cycles to get a feel for what it will be like on a 4.77mhz XT.
While it's not 100% true to the real hardware, it's a great start especially if you are trying to target multiple platforms simultaneously.
There's also a few extra books I always find handy -- Ferraro's "programmers guide to the EGA/VGA" is pretty much a must-have; wish I could find that in PDF as my print copy is getting pretty threadbare. (and it would be nice to be able to do a fulltext search)... Another book that is really good once you get down to the low-level stuff is Micheal Abrash's "Black Book" -- a halfway decent HTML version can be found here:
http://www.phatcode.net/res/224/files/html/index.html
Though the later chapters cover 386 and higher processors and the VGA card, most of the early chapters apply well to the 8088 -- particularly the "cycle eaters" sections.
Ralph Browns Interrupt lists:
http://www.ctyme.com/rbrown.htm
Is also VERY handy for doing DOS programming -- I refer to it all the time... (though my code is using software int's less and less)
That's all I can think of for now...