You might picture the EVM as something like a virtual processor running Solidity. That's wrong twice. First, the EVM never sees Solidity — it executes bytecode, a sequence of single-byte instructions compiled from Solidity (or Vyper, or Huff, or hand-written assembly). Second, the EVM's architecture is a stack machine, meaning it doesn't use named registers like an x86 CPU. Every operation pulls inputs from and pushes outputs onto a last-in-first-out stack.
The stack holds 256-bit (32-byte) words, and it has a hard maximum depth of 1,024 items. Most operations consume one or two items from the top and push one result back. There are no floating-point numbers, no native string type. Everything is a 256-bit integer, and the bytecode is responsible for interpreting those integers as addresses, booleans, or whatever the contract logic needs.
This architecture is why Solidity has a "stack too deep" compilation error — the EVM can only directly access the top 16 stack slots via its DUP and SWAP opcodes. If a function has too many local variables, the compiler literally cannot reach them.
⚠ Common mistake: Assuming the EVM has memory like a normal computer. The EVM actually has three distinct data locations: the stack (fast, tiny, for computation), memory (byte-addressable, ephemeral, wiped after each call), and storage (persistent key-value store on-chain, expensive). Confusing these is the single most common source of gas misunderstanding.