how does software work with hardware