OK, to begin with:
The I/O Addressing Space, better known as the I/O ports, are an 'addressing' mechanism that operates in parallel to the memory addressing (they are
not memory addresses, however; they simply work in a somewhat similar fashion). In the x86 I/O adressing is 16 bits wide, giving 65536 possible I/O ports. Each of which could be used to either read a byte of data from a device or write a byte of data to a device (or both, depending on the device in question). In assembly language, the [tt]IN[/tt], [tt]INS[/tt], [tt]OUT[/tt] and [tt]OUTS[/tt] instructions access these I/O ports (the commonly used C functions in the form of inport() and outport() are usually little more than wrappers around this functionality). Any device will have at least one port; many have several (e.g.,the PC speaker uses a single 1-byte port, a COM port uses 8 ports, while certain types of network card use 32).
While the 'standard' peripherals (e.g., floppy disk, hard disk, COM and LPT ports, etc.) have default I/O addresses, many of them are not permanently fixed, and can be reassigned as needed. The reason for this is that some devices, especially early 8-bit ISA devices, often could only work in certain locations, and it was necessary to be able to reassign devices to avoid conflicts. Tables of the default I/O address mappings are available on the web; the
PC Guide pages on I/O Addresses have one that is particularly good, if a bit confusing to read. A more conventional table, with a good deal of detailed information, can be seen at
this location.
As far as the specific values of ports 0x0070 and 0x0071, they are assigned to the CMOS RAM, and also access the real-time clock, and the NMI enable/disable line. The first floppy drive's ports are at 0x03F0-0x03F7 (yes, there's a conflict with the primary IDE slave; why it is not a problem would take a whole other posting, and I frankly would have to look up the details myself anyway), and also requires the use of the first DMA controller's ports at 0x0000-0x000F.