These languages provide the programmer with full control over program memory and the underlying machine code instructions.
Programs written in low-level languages tend to be relatively non-portable, due to being optimized for a certain type of system architecture.
[1] Although few programs are written in machine languages, programmers often become adept at reading it through working with core dumps or debugging from the front panel.
Example: The same Fibonacci number calculator as above, but in x86-64 assembly language using Intel syntax: In this code example, the registers of the x86-64 processor are named and manipulated directly.
In many respects (including directory operations and memory allocation), C provides “an interface to system-dependent objects that is itself relatively system independent”.
During the late 1960s and 1970s, high-level languages that included some degree of access to low-level programming functions, such as PL/S, BLISS, BCPL, extended ALGOL and NEWP (for Burroughs large systems/Unisys Clearpath MCP systems), and C, were introduced.
Furthermore, as referenced above, the following block of C is from the GNU Compiler and shows the inline assembly ability of C. Per the GCC documentation this is a simple copy and addition code.