How are you booting and running your code with BIOS only?
Assuming you really are only using BIOS, or even if you were using DOS that would be okay. You simply address the hardware, specify the address of some hardware register right in the instruction or put that address in a register and do a register indirect read or write.
Access to hardware is only difficult when an operating system is in the way, making the hardware do something useful of course is much easier with an operating system, naturally.
Fortunately the BIOS has enumerated the pci(e) hardware, that is the PC way of doing things, so you can use some DOS utilities I think to find out how the hardware has been enumerated. Another "PC way of doing things" the PCI(e) address for the hardware is also the x86 address, the two address spaces overlap, so once you get the PCI(e) address for some peripheral then you can use that address in your code. naturally since the pcie window is relatively small for things like video you still have to page through the peripheral memory, but that is peripheral specific not a PC or x86 thing.
if your motherboard has a serial port/uart that would be the best place to start with directly accessing hardware.
Even better would be to use a simulator pcemu or other, rather than start on hardware, depending on your choice of simulator you may have much better visibility into what is going on and a peripheral like a uart may be even that much simpler as you might not have to initialize it just start throwing bytes at it (until you learn more).