machine instructions

"user" versus "developer"

deliberate obfuscation

high level versus low level

typical (early) microprocessor:

6502 receives 8 bit binary pattern during instruction fetch

examples:

microprocessors only recognize binary bit patterns;
does not directly understand text, decimal numbers, etc..

a program is an ordered set of instructions that cause the microprocessor to do something, e.g. add contents of memory location 60 to contents of location 61:

microprocessor can execute this directly

much easier in hexadecimal:

easier to remember the opcodes; easier to type in.

cannot be directly executed by microprocessor; need a hexadecimal loader program to convert the numbers to binary.

assembly language programming

hex loader makes programming easier than entering binary, but we can make it even easier, still, by further including an assebler:

we enter:

and then run an assembler program to convert to the binary above.

problem: more distant from computer, could promote reduced understanding of what's really going on.

simplification of programming may partially obfuscate meaning, e.g. mnemonic LDA can mean direct e.g. LDA $C030, direct zeropage e.g. LDA $60, indirect, indirect zero page, etc., all having the same mnemonic but different opcodes.

thus programming with an assembler may reduce understanding of what's happening, if care not taken.

high level languages

assembler easier to write programs than hex loader, but still not portable.

therefore we consider the "architecture independent assembler", e.g. gcc, for portability of programs across different architectures.