Appendix for code examples
Chapter 2 Code examples
;----------------------------------------------------------- ; zstr_count: ; Counts a zero-terminated ASCII string to determine its size ; in: eax = start address of the zero terminated string ; out: ecx = count = the length of the string zstr_count: ; Entry point 00000030 B9FFFFFFFF mov ecx, -1 ; Init the loop counter, pre-decrement ; to compensate for the increment .loop: 00000035 41 inc ecx ; Add 1 to the loop counter 00000036 803C0800 cmp byte [eax + ecx], 0 ; Compare the value at the string's ; [starting memory address Plus the ; loop offset], to zero 0000003A 75F9 jne .loop ; If the memory value is not zero, ; then jump to the label called '.loop', ; otherwise continue to the next line .done: ; We don't do a final increment, ; because even though the count is base 1, ; we do not include the zero terminator in the ; string's length 0000003C C3 ret ; Return to the calling program
(Phase 1) The Front End (Step 1) Lexical Analysis: This is where the high-level language text is read in and divided into tokens, each of which corresponds to a symbol in the programming language, for instance a keyword, identifier, or symbol name. (Step 2) Syntax Analysis or Parsing: Please refer to the Parsing section as it goes into greater detail. (Step 3) Type-Checking: This step analyses the syntax tree of the language to check if the program violates certain consistency requirements. For example if a variable is used but not declared or if it is used but in a context that does not make sense for the given type of the variable, such that if you attempted to use a boolean value as a function pointer. (Phase 2) The Middle End (Step 4) Intermediate Code Generation: The program then takes what the front end has built from this point and generates a simple machine independent intermediate language. (Phase 3) The Back End (Step 5) Register Allocation: The back end starts by taking the intermediate language that the middle end created and allocates the symbolic variable names to numbers each of which corresponds to a register in the machines architecture code. (Step 6) Machine Code Generation: This is where the intermediate language created in the middle end gets translated into assembly language for the specified machine architecture. (Step 7) Assembly and Linking: The assembly-language code is translated into binary representation and addresses of variables, function, etc., are determined.