Well first allow me to explain what I actually meant to ask. Ok, so it is clearly known that without software, a piece of hardware is just a lifeless body, something without a soul. But I clearly cannot understand how this communication/interface between software and hardware is actually happening?
A Software is nothing but lines of code which finally after getting compiled, assembled, linked and is converted to a string of binary digits. But you see the hardware of the processor doesn't understand ones and zeros it understands a high voltage level and a low voltage level. but how is this transition from binary digits to voltage levels actually taking place? For a really quick analogy, if I wanted to lift a book there is actual physical contact between my hands and the book. But what about the interface between hardware and software?
I hope you people understand the crux of my question. It is really difficult to put it into straight-forward sentences. This may sound like a bizarre question, but trust me it's been bugging me for a really long time. I've taken courses on Computer Organization and basic processor Design, but they clearly failed in providing me an answer.
A similar question exists on StackOverflow and there is not one convincing answer. https://stackoverflow.com/questions/3043048/how-does-software-code-actually-communicate-with-hardware
EDIT: You see the standard process for the code to be executed by the processor is such that it passes through compiler -> assembler -> linker -> loader -> Memory. Because once the instructions get into the memory it is pretty straight forward as to how the processing takes place. The only inconsistency which I feel in that flow is about how the transition from loader -> memory. is happening? This is one of the straightforward ways I can put up the question. But if it would be really grateful if you've understood the soul of the question.
binary output * logical threshold voltage
. For Arduino boards it maps from {0,1} to {0V, 5V} \$\endgroup\$