You're right, there is such a thing as immediate addressing mode. However, in compiled languages I'm familiar with constants aren't really constant. For example, C++ has an operator called const_cast<>() that exists almost completely for the purpose of allowing you to change a constant's value. That makes it impossible to use an immediate value simply because it can change. Also strings can never be immediate values. The largest immediate value you can have (on a 32bit machine) is a 32bit value. That means you have to pass the address of the offset of the string in memory and then read memory to actually get the string's contents. Of course, with optimizing compilers it may be able to use immediate values _sometimes_ but it most certainly can not do it _all times_.