In x86, there is two address spaces . The main and IO ports. IO ports are very limited, there is separate instructions to access that address space with 32-bit maximum access and it's pretty small, only 64 KiB.

It's still used in PCs today but much preferred way is to use main address space. It's divided into zones, many of them are mapped into devices. It's called Memory Mapped IO.

It's only true for x86 though, ARM never had IO ports, so there is only MMIO. Usually hardcoded and can be found in the documentation to the SoC.

Elbrus in contrast have compatibility with IO ports. Except there is no instruction to access it.

Instead, there is a flag to load/store instructions called MAS_IOADDR. Despite the name, it's only skips virt-to-phys translation and always accesses phys memory.

IO ports there are actually MMIO addresses and if you want for example, set up VGA screen, you need to take your VGA port addresses and add the IO area base address (which is usually 0x101000000), set the MAS_IOADDR flag and just read/write.