logging in or signing up Assembly Language aSGuest30980 Download Post to : URL : Related Presentations : Share Add to Flag Embed Email Send to Blogs and Networks Add to Channel Uploaded from authorPOINT lite Insert YouTube videos in PowerPont slides with aS Desktop Copy embed code: (To copy code, click on the text box) Embed: URL: Thumbnail: WordPress Embed Customize Embed The presentation is successfully added In Your Favorites. Views: 736 Category: Education License: All Rights Reserved Like it (1) Dislike it (0) Added: November 09, 2009 This Presentation is Public Favorites: 1 Presentation Description No description available. Comments Posting comment... By: WafaAli (15 month(s) ago) gud material i have found in it.. Saving..... Post Reply Close Saving..... Edit Comment Close Premium member Presentation Transcript INTRODUCTION TO IBM PC ASSEMBLY LANGUAGE : 11/10/2009 CAP221 1 INTRODUCTION TO IBM PC ASSEMBLY LANGUAGE Assembly Language Syntax : 11/10/2009 CAP221 2 Assembly Language Syntax An assembly language program consists of statements. RULES : 11/10/2009 CAP221 3 RULES Only one statement is written per line Each statement is either an instruction or an assembler directive instruction is translated into machine code assembler directive instructs the assembler to perform some specific task Program Statement : 11/10/2009 CAP221 4 Program Statement The general format for an assembly language program statement is as follows: name operation operand’(s) comment Examples: START: MOV CX,5 ; initialize counter MAIN PROC Name Field : 11/10/2009 CAP221 5 Name Field This field is used for: instruction label: if present, a label must be followed by a colon (:) procedure names variable names. Name Field : 11/10/2009 CAP221 6 Name Field Assembler translates names into memory addresses. Names can be from 1 to 31 characters long: (letters, digits, and special characters: ?, ., _, $, @, %) Embedded blanks are not allowed, names may not begin with a digit, period (if used) must be the first character Name Field : 11/10/2009 CAP221 7 Name Field Examples: Legal names Illegal names COUNTER1 2ABC @CHARACTER TWO WORDS $500 A45.26 SUM_OF_DIGITS YOU&ME .TEST DONE? Operation Field : 11/10/2009 CAP221 8 Operation Field For an instruction The opcode describes the operation’s function Symbolic opcodes are translated into machine language opcode. Operation Field : 11/10/2009 CAP221 9 Operation Field For an assembler directive This field consists of a pseudo-operation code (pseudo-op) pseudo-ops tell assembler to do something Operand Field : 11/10/2009 CAP221 10 Operand Field For an instruction Examples of instructions with different operand fields NOP ; Instruction with no operand field INC AX ; Instruction with one operand field ADD AX, 2 ; Instruction with two operand field If 2 operands: the first is destination, the second is the source operand Numbers : 11/10/2009 CAP221 11 Numbers Examples: number type 1010 decimal 1010B binary -2134D decimal ABFFH illegal 0ABFFH hex 1BHH illegal 1BFFH hex 1,23 illegal Characters : 11/10/2009 CAP221 12 Characters Characters and character segments must be enclosed in single or double quotes; ‘A' , “hello“. Assembler translates characters to their ASCII code Byte variables : 11/10/2009 CAP221 13 Byte variables Syntax: Name DB initial value Examples: ALPHA DB 4 Word variables ( 2 bytes) : 11/10/2009 CAP221 14 Word variables ( 2 bytes) Syntax: Name DW initial value Example: WRD DW -2 The assembler stores integers with the least significant byte in the lowest address of the memory area allocated to the integer Example: WD DW 1234H low byte WD contains 34h, high byte contains 12h Array Examples : 11/10/2009 CAP221 15 Array Examples B_ARRAY DB 10, 25, 20 If array starts at offset address 0200h, it will look like this: Symbol Address Contents B-ARRAY 0200H 10 B-ARRAY+1 0200H+1 25 B-ARRAY+2 0200H+2 20 Array Examples : 11/10/2009 CAP221 16 Array Examples W_ARRAY DW 0FFFFh, 789Ah, 0BCDEh If array starts at offset address 0100h, it will look like this: Symbol Address Contents W_ARRAY 0100H FFFFH W_ARRAY+2 0102H 789AH W_ARRAY+4 0104H BCDEH Character strings : 11/10/2009 CAP221 17 Character strings Examples: 1) LETTERS DB ‘AaBCbc‘ Is equivalent to LETTERS DB 41H,61H,42H,43H,62H,63H 2) MSG DB ‘ABC‘,0AH,0DH,‘$‘ Is equivalent to MSG DB 41H,42H,43H,0AH,0DH,24H Constant Declaration : 11/10/2009 CAP221 18 Constant Declaration In an assembly language program, constants are defined through the use of the EQU directive. Syntax: Name EQU constant The EQU directive is used to assign a name to a constant. Use of constant names makes an assembly language easier to understand. No memory is allocated for a constant. The symbol on the right of EQU cab also be a string Constant Declaration : 11/10/2009 CAP221 19 Constant Declaration Examples: 1) LF EQU 0AH ; LF can be used in place of 0Ah MOV DL LF MOV DL 0AH 2) PMT EQU ‘TYPE YOUR NAME‘ ; instead of MSG DB ‘TYPE YOUR NAME‘ We can use MSG DB PMT Have the same machine code BASIC INSTRUCTIONS : 11/10/2009 CAP221 20 BASIC INSTRUCTIONS MOV and XCHG MOV instruction : 11/10/2009 CAP221 21 MOV instruction Is used to transfer data : between registers, between a register & a memory location. Or To move a number directly into a register or memory location. Syntax : 11/10/2009 CAP221 22 Syntax MOV destination , source Example: MOV AX , WORD1 This reads “ Move WORD1 to AX “ The contents of register AX are replaced by the contents of the memory location WORD1. Mov AX , WORD1 : 11/10/2009 CAP221 23 Mov AX , WORD1 Before After AX AX WORD1 WORD1 0006 0008 0008 0008 MOV AH , ‘A’ : 11/10/2009 CAP221 24 MOV AH , ‘A’ This is a move of the 041h ( the ASCII code of “A” ) into register AH. The previous value of AH is overwritten ( replaced by new value ) XCHG instruction : 11/10/2009 CAP221 25 XCHG instruction (Exchange) operation is used to exchange the contents of two registers, or a register and a memory location Syntax : 11/10/2009 CAP221 26 Syntax XCHG destination , source Example : 11/10/2009 CAP221 27 Example XCHG AH , BL This instruction swaps the contents of AH and BL. XCHG AH , BL : 11/10/2009 CAP221 28 XCHG AH , BL Before After AH AL 1A AH AL BH BL BH BL 00 05 00 00 05 00 1A Example : 11/10/2009 CAP221 29 Example XCHG AX , WORD1 This swaps the contents of AX and memory location WORD1. Restrictions on MOV : 11/10/2009 CAP221 30 Restrictions on MOV Example : ILLEGAL : MOV WORD1 , WORD2 LEGAL: MOV AX , WORD2 MOV WORD1 , AX ADD & SUB : 11/10/2009 CAP221 31 ADD & SUB Are used to add & subtract the contents of two registers, a register & memory location , or a register and a number memory location and a number. Syntax : 11/10/2009 CAP221 32 Syntax ADD destination , source SUB destination , source Example : 11/10/2009 CAP221 33 Example ADD WORD1 , AX This instruction , “ Add AX to WORD1 “ , causes the contents of AX & memory word WORD1 to be added, and the sum is stored in WORD1. AX is unchanged. Example : 11/10/2009 CAP221 34 Example SUB AX , DX This instruction , “ Subtract DX from AX “ , the value of DX is subtracted from the value of AX , with the difference being stored in AX. DX is unchanged. Example : 11/10/2009 CAP221 35 Example ADD BL , 5 This is an addition of the number 5 to the contents of register BL. ILLEGAL : 11/10/2009 CAP221 36 ILLEGAL ADD BYTE1 , BYTE2 Solution : move BYTE2 to a register before adding MOV AL , BYTE2 ; AL gets BYTE2 ADD BYTE1 , AL ; add it to BYTE1 INC ( increment ) : 11/10/2009 CAP221 37 INC ( increment ) Is used to add 1 to the contents of a Register or Memory location DEC ( decrement ) : 11/10/2009 CAP221 38 DEC ( decrement ) Is used to subtract 1 from the contents of a Register or Memory location Syntax : 11/10/2009 CAP221 39 Syntax INC destination DEC destination Example : 11/10/2009 CAP221 40 Example INC WORD1 adds 1 to the contents of WORD1 Example : 11/10/2009 CAP221 41 Example DEC BYTE1 subtracts 1 to the variable BYTE1 NEG : 11/10/2009 CAP221 42 NEG Is used to negate the contents of the destination. It does this by replacing the contents by its two’s complement. Syntax : 11/10/2009 CAP221 43 Syntax NEG destination The destination may be a register or memory location. NEG BX : 11/10/2009 CAP221 44 NEG BX 0002 FFFE Before After BX BX Translation of HLL to Assembly Language : 11/10/2009 CAP221 45 Translation of HLL to Assembly Language Statement Translation B = A MOV AX , A ; moves A into AX MOV B , AX ; and then into B WHY Because direct memory – memory move is illegal we must move the contents of A into a register before moving it to B. Translation of HLL to Assembly Language : 11/10/2009 CAP221 46 Translation of HLL to Assembly Language Statement Translation A = 5 – A MOV AX , 5 ; put 5 in AX SUB AX , A ; AX…. 5 – A MOV A , AX ; put it in A Translation of HLL to Assembly Language : 11/10/2009 CAP221 47 Translation of HLL to Assembly Language Statement Translation A = B – 2 * A MOV AX , B ; AX has B SUB AX , A ; AX has B – A SUB AX , A ; AX has B – 2 * A MOV A , AX ; move results to B Program Structure : 11/10/2009 CAP221 48 Program Structure Machine language programs consist of : Codes, Data, and Stack. Each part occupies a memory segment. They are structured as program segments. Each program segment is translated into a memory segment by the assembler. Memory Models : 11/10/2009 CAP221 49 Memory Models The size of the code & data a program can have is determined by specifying a memory model using the . MODEL directive. Syntax : 11/10/2009 CAP221 50 Syntax . MODEL memory_mode1 SMALL MEDUIM COMPACT LARGE Code in one segment Data in one segment Code in more than one segment Data in one segment Code in one segment Data in more than one segment Code in more than one segment Data in more than one segment No array larger than 64K bytes. Slide 51: 11/10/2009 CAP221 51 Unless there is a lot of code or data, the appropriate model is SMALL. . MODEL directive should come before any segment definition. Data Segment : 11/10/2009 CAP221 52 Data Segment A program’s data segment contains all the variable definitions. Constant definitions are made here as well, but they may be placed elsewhere in the program since no memory allocation is involved. We use the . DATA directive followed by variable & constant declarations. Variable addresses are computed as offsets from the start of this segment Example : 11/10/2009 CAP221 53 Example .DATA WORD1 DW 2 WORD2 DW 5 MSG DB ‘ This is a message ‘ MASK EQU 10010010B Stack Segment : 11/10/2009 CAP221 54 Stack Segment Used to set aside storage for the stack Stack addresses are computed as offsets into this segment Use: .stack followed by a value that indicates the size of the stack Declaration Syntax : 11/10/2009 CAP221 55 Declaration Syntax .STACK size An optional number that specifies the stack area size in bytes. Example : 11/10/2009 CAP221 56 Example .STACK 100 H Sets aside 100h bytes for the stack area ( a reasonable size for most applications ) . If size is omitted , 1 KB is set aside for the stack area. Code Segment : 11/10/2009 CAP221 57 Code Segment It contains a program’s instructions. Syntax : 11/10/2009 CAP221 58 Syntax .CODE name Optional name for the segment Why?? there is no need for a name in a SMALL program The assembler will generate an error Inside the code segment : 11/10/2009 CAP221 59 Inside the code segment Instructions are organized as procedures. The simplest procedure definition is : name PROC ; body of the procedure name ENDP name is the name of the procedure, PROC and ENDP are pseudo-op that delineate the procedure Example : 11/10/2009 CAP221 60 Example .CODE MAIN PROC ; main procedure body MAIN ENDP ; other procedures go here Program Structure : 11/10/2009 CAP221 61 Program Structure A program has always the following general structure: .model small ;Select a memory model .stack 100h ;Define the stack size .data ; Variable and array declarations ; Declare variables at this level .code main proc ; Write the program main code at this level main endp ;Other Procedures ; Always organize your program into procedures end main ; To mark the end of the source file You do not have the permission to view this presentation. In order to view it, please contact the author of the presentation.
Assembly Language aSGuest30980 Download Post to : URL : Related Presentations : Share Add to Flag Embed Email Send to Blogs and Networks Add to Channel Uploaded from authorPOINT lite Insert YouTube videos in PowerPont slides with aS Desktop Copy embed code: (To copy code, click on the text box) Embed: URL: Thumbnail: WordPress Embed Customize Embed The presentation is successfully added In Your Favorites. Views: 736 Category: Education License: All Rights Reserved Like it (1) Dislike it (0) Added: November 09, 2009 This Presentation is Public Favorites: 1 Presentation Description No description available. Comments Posting comment... By: WafaAli (15 month(s) ago) gud material i have found in it.. Saving..... Post Reply Close Saving..... Edit Comment Close Premium member Presentation Transcript INTRODUCTION TO IBM PC ASSEMBLY LANGUAGE : 11/10/2009 CAP221 1 INTRODUCTION TO IBM PC ASSEMBLY LANGUAGE Assembly Language Syntax : 11/10/2009 CAP221 2 Assembly Language Syntax An assembly language program consists of statements. RULES : 11/10/2009 CAP221 3 RULES Only one statement is written per line Each statement is either an instruction or an assembler directive instruction is translated into machine code assembler directive instructs the assembler to perform some specific task Program Statement : 11/10/2009 CAP221 4 Program Statement The general format for an assembly language program statement is as follows: name operation operand’(s) comment Examples: START: MOV CX,5 ; initialize counter MAIN PROC Name Field : 11/10/2009 CAP221 5 Name Field This field is used for: instruction label: if present, a label must be followed by a colon (:) procedure names variable names. Name Field : 11/10/2009 CAP221 6 Name Field Assembler translates names into memory addresses. Names can be from 1 to 31 characters long: (letters, digits, and special characters: ?, ., _, $, @, %) Embedded blanks are not allowed, names may not begin with a digit, period (if used) must be the first character Name Field : 11/10/2009 CAP221 7 Name Field Examples: Legal names Illegal names COUNTER1 2ABC @CHARACTER TWO WORDS $500 A45.26 SUM_OF_DIGITS YOU&ME .TEST DONE? Operation Field : 11/10/2009 CAP221 8 Operation Field For an instruction The opcode describes the operation’s function Symbolic opcodes are translated into machine language opcode. Operation Field : 11/10/2009 CAP221 9 Operation Field For an assembler directive This field consists of a pseudo-operation code (pseudo-op) pseudo-ops tell assembler to do something Operand Field : 11/10/2009 CAP221 10 Operand Field For an instruction Examples of instructions with different operand fields NOP ; Instruction with no operand field INC AX ; Instruction with one operand field ADD AX, 2 ; Instruction with two operand field If 2 operands: the first is destination, the second is the source operand Numbers : 11/10/2009 CAP221 11 Numbers Examples: number type 1010 decimal 1010B binary -2134D decimal ABFFH illegal 0ABFFH hex 1BHH illegal 1BFFH hex 1,23 illegal Characters : 11/10/2009 CAP221 12 Characters Characters and character segments must be enclosed in single or double quotes; ‘A' , “hello“. Assembler translates characters to their ASCII code Byte variables : 11/10/2009 CAP221 13 Byte variables Syntax: Name DB initial value Examples: ALPHA DB 4 Word variables ( 2 bytes) : 11/10/2009 CAP221 14 Word variables ( 2 bytes) Syntax: Name DW initial value Example: WRD DW -2 The assembler stores integers with the least significant byte in the lowest address of the memory area allocated to the integer Example: WD DW 1234H low byte WD contains 34h, high byte contains 12h Array Examples : 11/10/2009 CAP221 15 Array Examples B_ARRAY DB 10, 25, 20 If array starts at offset address 0200h, it will look like this: Symbol Address Contents B-ARRAY 0200H 10 B-ARRAY+1 0200H+1 25 B-ARRAY+2 0200H+2 20 Array Examples : 11/10/2009 CAP221 16 Array Examples W_ARRAY DW 0FFFFh, 789Ah, 0BCDEh If array starts at offset address 0100h, it will look like this: Symbol Address Contents W_ARRAY 0100H FFFFH W_ARRAY+2 0102H 789AH W_ARRAY+4 0104H BCDEH Character strings : 11/10/2009 CAP221 17 Character strings Examples: 1) LETTERS DB ‘AaBCbc‘ Is equivalent to LETTERS DB 41H,61H,42H,43H,62H,63H 2) MSG DB ‘ABC‘,0AH,0DH,‘$‘ Is equivalent to MSG DB 41H,42H,43H,0AH,0DH,24H Constant Declaration : 11/10/2009 CAP221 18 Constant Declaration In an assembly language program, constants are defined through the use of the EQU directive. Syntax: Name EQU constant The EQU directive is used to assign a name to a constant. Use of constant names makes an assembly language easier to understand. No memory is allocated for a constant. The symbol on the right of EQU cab also be a string Constant Declaration : 11/10/2009 CAP221 19 Constant Declaration Examples: 1) LF EQU 0AH ; LF can be used in place of 0Ah MOV DL LF MOV DL 0AH 2) PMT EQU ‘TYPE YOUR NAME‘ ; instead of MSG DB ‘TYPE YOUR NAME‘ We can use MSG DB PMT Have the same machine code BASIC INSTRUCTIONS : 11/10/2009 CAP221 20 BASIC INSTRUCTIONS MOV and XCHG MOV instruction : 11/10/2009 CAP221 21 MOV instruction Is used to transfer data : between registers, between a register & a memory location. Or To move a number directly into a register or memory location. Syntax : 11/10/2009 CAP221 22 Syntax MOV destination , source Example: MOV AX , WORD1 This reads “ Move WORD1 to AX “ The contents of register AX are replaced by the contents of the memory location WORD1. Mov AX , WORD1 : 11/10/2009 CAP221 23 Mov AX , WORD1 Before After AX AX WORD1 WORD1 0006 0008 0008 0008 MOV AH , ‘A’ : 11/10/2009 CAP221 24 MOV AH , ‘A’ This is a move of the 041h ( the ASCII code of “A” ) into register AH. The previous value of AH is overwritten ( replaced by new value ) XCHG instruction : 11/10/2009 CAP221 25 XCHG instruction (Exchange) operation is used to exchange the contents of two registers, or a register and a memory location Syntax : 11/10/2009 CAP221 26 Syntax XCHG destination , source Example : 11/10/2009 CAP221 27 Example XCHG AH , BL This instruction swaps the contents of AH and BL. XCHG AH , BL : 11/10/2009 CAP221 28 XCHG AH , BL Before After AH AL 1A AH AL BH BL BH BL 00 05 00 00 05 00 1A Example : 11/10/2009 CAP221 29 Example XCHG AX , WORD1 This swaps the contents of AX and memory location WORD1. Restrictions on MOV : 11/10/2009 CAP221 30 Restrictions on MOV Example : ILLEGAL : MOV WORD1 , WORD2 LEGAL: MOV AX , WORD2 MOV WORD1 , AX ADD & SUB : 11/10/2009 CAP221 31 ADD & SUB Are used to add & subtract the contents of two registers, a register & memory location , or a register and a number memory location and a number. Syntax : 11/10/2009 CAP221 32 Syntax ADD destination , source SUB destination , source Example : 11/10/2009 CAP221 33 Example ADD WORD1 , AX This instruction , “ Add AX to WORD1 “ , causes the contents of AX & memory word WORD1 to be added, and the sum is stored in WORD1. AX is unchanged. Example : 11/10/2009 CAP221 34 Example SUB AX , DX This instruction , “ Subtract DX from AX “ , the value of DX is subtracted from the value of AX , with the difference being stored in AX. DX is unchanged. Example : 11/10/2009 CAP221 35 Example ADD BL , 5 This is an addition of the number 5 to the contents of register BL. ILLEGAL : 11/10/2009 CAP221 36 ILLEGAL ADD BYTE1 , BYTE2 Solution : move BYTE2 to a register before adding MOV AL , BYTE2 ; AL gets BYTE2 ADD BYTE1 , AL ; add it to BYTE1 INC ( increment ) : 11/10/2009 CAP221 37 INC ( increment ) Is used to add 1 to the contents of a Register or Memory location DEC ( decrement ) : 11/10/2009 CAP221 38 DEC ( decrement ) Is used to subtract 1 from the contents of a Register or Memory location Syntax : 11/10/2009 CAP221 39 Syntax INC destination DEC destination Example : 11/10/2009 CAP221 40 Example INC WORD1 adds 1 to the contents of WORD1 Example : 11/10/2009 CAP221 41 Example DEC BYTE1 subtracts 1 to the variable BYTE1 NEG : 11/10/2009 CAP221 42 NEG Is used to negate the contents of the destination. It does this by replacing the contents by its two’s complement. Syntax : 11/10/2009 CAP221 43 Syntax NEG destination The destination may be a register or memory location. NEG BX : 11/10/2009 CAP221 44 NEG BX 0002 FFFE Before After BX BX Translation of HLL to Assembly Language : 11/10/2009 CAP221 45 Translation of HLL to Assembly Language Statement Translation B = A MOV AX , A ; moves A into AX MOV B , AX ; and then into B WHY Because direct memory – memory move is illegal we must move the contents of A into a register before moving it to B. Translation of HLL to Assembly Language : 11/10/2009 CAP221 46 Translation of HLL to Assembly Language Statement Translation A = 5 – A MOV AX , 5 ; put 5 in AX SUB AX , A ; AX…. 5 – A MOV A , AX ; put it in A Translation of HLL to Assembly Language : 11/10/2009 CAP221 47 Translation of HLL to Assembly Language Statement Translation A = B – 2 * A MOV AX , B ; AX has B SUB AX , A ; AX has B – A SUB AX , A ; AX has B – 2 * A MOV A , AX ; move results to B Program Structure : 11/10/2009 CAP221 48 Program Structure Machine language programs consist of : Codes, Data, and Stack. Each part occupies a memory segment. They are structured as program segments. Each program segment is translated into a memory segment by the assembler. Memory Models : 11/10/2009 CAP221 49 Memory Models The size of the code & data a program can have is determined by specifying a memory model using the . MODEL directive. Syntax : 11/10/2009 CAP221 50 Syntax . MODEL memory_mode1 SMALL MEDUIM COMPACT LARGE Code in one segment Data in one segment Code in more than one segment Data in one segment Code in one segment Data in more than one segment Code in more than one segment Data in more than one segment No array larger than 64K bytes. Slide 51: 11/10/2009 CAP221 51 Unless there is a lot of code or data, the appropriate model is SMALL. . MODEL directive should come before any segment definition. Data Segment : 11/10/2009 CAP221 52 Data Segment A program’s data segment contains all the variable definitions. Constant definitions are made here as well, but they may be placed elsewhere in the program since no memory allocation is involved. We use the . DATA directive followed by variable & constant declarations. Variable addresses are computed as offsets from the start of this segment Example : 11/10/2009 CAP221 53 Example .DATA WORD1 DW 2 WORD2 DW 5 MSG DB ‘ This is a message ‘ MASK EQU 10010010B Stack Segment : 11/10/2009 CAP221 54 Stack Segment Used to set aside storage for the stack Stack addresses are computed as offsets into this segment Use: .stack followed by a value that indicates the size of the stack Declaration Syntax : 11/10/2009 CAP221 55 Declaration Syntax .STACK size An optional number that specifies the stack area size in bytes. Example : 11/10/2009 CAP221 56 Example .STACK 100 H Sets aside 100h bytes for the stack area ( a reasonable size for most applications ) . If size is omitted , 1 KB is set aside for the stack area. Code Segment : 11/10/2009 CAP221 57 Code Segment It contains a program’s instructions. Syntax : 11/10/2009 CAP221 58 Syntax .CODE name Optional name for the segment Why?? there is no need for a name in a SMALL program The assembler will generate an error Inside the code segment : 11/10/2009 CAP221 59 Inside the code segment Instructions are organized as procedures. The simplest procedure definition is : name PROC ; body of the procedure name ENDP name is the name of the procedure, PROC and ENDP are pseudo-op that delineate the procedure Example : 11/10/2009 CAP221 60 Example .CODE MAIN PROC ; main procedure body MAIN ENDP ; other procedures go here Program Structure : 11/10/2009 CAP221 61 Program Structure A program has always the following general structure: .model small ;Select a memory model .stack 100h ;Define the stack size .data ; Variable and array declarations ; Declare variables at this level .code main proc ; Write the program main code at this level main endp ;Other Procedures ; Always organize your program into procedures end main ; To mark the end of the source file