INTRODUCTION TO IBM PC ASSEMBLY LANGUAGE 1 CAP221 4/8/2015 Assembly Language Syntax • An assembly language program consists of statements. • The syntax of an assembly language program statement obeys the following rules: 2 CAP221 4/8/2015 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 3 CAP221 4/8/2015 Program Statement • The general format for an assembly language program statement is as follows: name operation operand’(s) comment Examples: START: MOV CX,5 MAIN PROC 4 ; initialize counter CAP221 4/8/2015 Name Field • This field is used for: instruction label: if present, a label must be followed by a colon (:) procedure names variable names. 5 CAP221 4/8/2015 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 6 CAP221 4/8/2015 Name Field Examples: Legal names 7 Illegal names COUNTER1 2ABC @CHARACTER $500 SUM_OF_DIGITS .TEST DONE? TWO WORDS A45.26 YOU&ME CAP221 4/8/2015 Operation Field For an instruction • This field consists of a symbolic operation code, known as opcode • The opcode describes the operation’s function • Symbolic opcodes are translated into machine language opcode. 8 CAP221 4/8/2015 Operation Field For an assembler directive • This field consists of a pseudooperation code (pseudo-op) • pseudo-ops tell assembly to do something 9 CAP221 4/8/2015 Operand Field For an instruction • This field specifies data to be acted on. It may have one, two or no operands at all. • 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 10 CAP221 4/8/2015 Operand Field For an assembler directive • This field contains more information about the directive 11 CAP221 4/8/2015 Comment Field • A semicolon marks the beginning of a comment • A semicolon in the beginning of a line makes it all a comment line • Good programming practice dictates the use of a comment on almost every line. 12 CAP221 4/8/2015 Key rules for the use of comments • Do not say something that is obvious • Put instruction in context of program 13 CAP221 4/8/2015 Comment Field Examples of good and bad Comments MOV CX , 0 ; Move 0 to CX (This is not a good comment.) MOV CX , 0 ; CX counts terms, initially set to 0 (This is a good comment.) 14 CAP221 4/8/2015 Numbers • Binary number is written as a bit string followed by the letter `b`. • decimal number is written as a string of decimal digits followed by the letter `d`. • Hex number is written as a string of hex digits followed by the letter `h`. • Hex number must begin with a decimal digit • Numbers may have an optional sign 15 CAP221 4/8/2015 Numbers Examples: number type 1010 1010B -2134D ABFFH 0ABFFH 1BHH 1BFFH 1,23 decimal binary decimal illegal hex illegal hex illegal 16 CAP221 4/8/2015 Characters • Characters and character segments must be enclosed in single or double quotes; ‘A' , “hello“. • Assembler translates characters to their ASCII code 17 CAP221 4/8/2015 Variables Declaring Integer Variables: • An integer is a whole number, such as 4 or 4444. Integers have no fractional part. Integer variables can be initialized in several ways with the data allocation directives. 18 CAP221 4/8/2015 Variables Allocating Memory for Integer Variables: • When an integer variable is declared, the assembler allocates memory space for the variable. The variable name becomes a reference to the memory space allocated to that variable. 19 CAP221 4/8/2015 Syntax name directive initializer 20 CAP221 initial value 4/8/2015 Variables Pseudo-op type • DB unsigned signed • DW unsigned signed • DD unsigned signed size 1 byte 1 byte 2 bytes 2 bytes 4 bytes range 0 to 255. -128 to +127. 0 to 65,535 (64K). -32,768 to +32,767. 0 to 4,294,967,295 (4 Mbytes). 4 bytes -2,147,483,648 to +2,147,483,647. • DQ 8-byte integer 4 consecutive words • DT 10-byte integer 10 consecutive bytes 21 CAP221 4/8/2015 Byte variables • Syntax: Name DB initial value Examples: ALPHA BYT 22 DB DB 4 ? CAP221 4/8/2015 Word variables • 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 23 CAP221 4/8/2015 Array Declaration • An array is a sequential collection of variables, all of the same size and type • Array elements occupy contiguous memory locations. • The program references each element relative to the start of the array. • An array is declared by giving it a name, a type, and a series of initializing values or placeholders (?). 24 CAP221 4/8/2015 Array Examples B_ARRAY DB 10, 25, 20 If array starts at offset address 0200h, it will look like this: Symbol B-ARRAY B-ARRAY+1 B-ARRAY+2 25 Address 0200H 0200H+1 0200H+2 CAP221 Contents 10 25 20 4/8/2015 Array Examples W_ARRAY DW 0FFFFh, 789Ah, 0BCDEh If array starts at offset address 0100h, it will look like this: Symbol W_ARRAY W_ARRAY+2 W_ARRAY+4 26 Address 0100H 0102H 0104H CAP221 Contents FFFFH 789AH BCDEH 4/8/2015 Character strings • An array of characters can be initialized by a string of characters. • Inside a string, the assembler differentiates between upper and lower cases (different ASCII codes). • It is possible to combine characters and numbers in one definition 27 CAP221 4/8/2015 Character strings Examples: 1) LETTERS Is equivalent to LETTERS 2) MSG Is equivalent to MSG 28 DB ‘AaBCbc‘ DB 41H,61H,42H,43H,62H,63H DB ‘ABC‘,0AH,0DH,‘$‘ DB 41H,42H,43H,0AH,0DH,24H CAP221 4/8/2015 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 29 CAP221 4/8/2015 Constant Declaration Examples: 1) LF EQU 0AH ; LF can be used in place of 0Ah MOV MOV DL DL LF 0AH PMT EQU ‘TYPE YOUR NAME‘ ; DB ‘TYPE YOUR NAME‘ DB PMT Have the same machine code 2) instead of MSG We can use MSG 30 CAP221 4/8/2015 BASIC INSTRUCTIONS MOV and XCHG 31 CAP221 4/8/2015 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. 32 CAP221 4/8/2015 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. 33 CAP221 4/8/2015 Mov AX , WORD1 Before After 0006 0008 AX AX 0008 0008 WORD1 WORD1 34 CAP221 4/8/2015 MOV AX , BX • AX gets what was previously in BX , BX is unchanged. 35 CAP221 4/8/2015 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 ) 36 CAP221 4/8/2015 XCHG instruction • (Exchange) operation is used to exchange the contents of – two registers, or – a register and a memory location 37 CAP221 4/8/2015 Syntax XCHG destination , source 38 CAP221 4/8/2015 Example XCHG AH , BL This instruction swaps the contents of AH and BL. 39 CAP221 4/8/2015 XCHG AH , BL After Before 1A AH 00 BH 40 00 05 00 AL AH AL 00 1A BH BL 05 BL CAP221 4/8/2015 Example XCHG AX , WORD1 • This swaps the contents of AX and memory location WORD1. 41 CAP221 4/8/2015 Restrictions on MOV & XCHG MOV Source Operand Destination Operand General Register Segment Register Memory Location Constant General Register yes yes yes no Segment Register yes no yes no Memory Location yes yes no no Constant yes no yes no 42 CAP221 4/8/2015 Restrictions on MOV & XCHG XCHG Source Operand 43 Destination Operand General Register Memory Location General Register yes yes Memory Location yes no CAP221 4/8/2015 Restrictions on MOV & XCHG Example : ILLEGAL : MOV WORD1 , WORD2 LEGAL: MOV AX , WORD2 MOV WORD1 , AX 44 CAP221 4/8/2015 ADD & SUB • Are used to add & subtract the contents of – two registers, – a register & memory location , or – add ( subtract ) a number to ( from ) a register or a memory location. 45 CAP221 4/8/2015 Syntax 46 ADD destination , source SUB destination , source CAP221 4/8/2015 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. 47 CAP221 4/8/2015 ADD WORD1 , AX Before 48 After 01BC 01BC AX AX 0523 06DF WORD1 WORD1 CAP221 4/8/2015 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. 49 CAP221 4/8/2015 SUB AX , DX Before After 0000 50 FFFF AX AX 0001 0001 DX DX CAP221 4/8/2015 Example ADD BL , 5 This is an addition of the number 5 to the contents of register BL. 51 CAP221 4/8/2015 Legal combinations of operands for ADD & SUB Destination operand Source Operand General Register Memory location General Register yes yes Memory location yes no Constant yes yes 52 CAP221 4/8/2015 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 53 CAP221 4/8/2015 INC ( increment ) Is used to add 1 to the contents of a • Register or • Memory location 54 CAP221 4/8/2015 DEC ( decrement ) Is used to subtract 1 from the contents of a • Register or • Memory location 55 CAP221 4/8/2015 Syntax INC destination DEC destination 56 CAP221 4/8/2015 Example INC WORD1 adds 1 to the contents of WORD1 57 CAP221 4/8/2015 INC WORD1 58 Before After 0002 0003 WORD1 WORD1 CAP221 4/8/2015 Example DEC BYTE1 subtracts 1 to the variable BYTE1 59 CAP221 4/8/2015 DEC BYTE1 Before 60 After FE FD BYTE1 BYTE1 CAP221 4/8/2015 NEG • Is used to negate the contents of the destination. • It does this by replacing by its two’s complement. 61 CAP221 the contents 4/8/2015 Syntax NEG destination The destination may be a register or memory location. 62 CAP221 4/8/2015 NEG BX 63 Before After 0002 FFFE BX BX CAP221 4/8/2015 Type agreement of operands • For instruction with 2 operand, the two operands must be of the same type; that is, both words or bytes. • Illegal …. MOV AX , BYTE1 …. Is not allowed. • Assembler will accept both the following instructions : MOV AH , ‘A’ ….. moves 41h into AH MOV AX , ‘A’ ….. moves 0041h into AX 64 CAP221 4/8/2015 Translation of HLL to Assembly Language Statement B = A Translation 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. 65 CAP221 4/8/2015 Translation of HLL to Assembly Language StatementTranslation A = 5–A MOV AX , 5 SUB AX , A MOV A , AX ; put 5 in AX ; AX…. 5 – A ; put it in A There is another shorter way : 66 CAP221 4/8/2015 67 NEG A ; A = -A ADD A , 5 ;A = 5 - A CAP221 4/8/2015 Translation of HLL to Assembly Language Statement A= B–2*A Translation MOV AX , B ; AX has B SUB AX , A ; AX has B – A SUB AX , A ; AX has B–2*A MOV A , AX 68 CAP221 ; move results to B 4/8/2015 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. 69 CAP221 4/8/2015 Memory Models The size of the code & data a program can have is determined by specifying a memory model using the . MODEL directive. 70 CAP221 4/8/2015 Syntax . MODEL memory_mode1 LARGE SMALL 71 MEDUIM COMPACT Code in one segment Code in more than one segment Code in one segment Data in one segment Data in one segment Data in more than one segment CAP221 Code in more than one segment Data in more than one segment No array larger than 64K bytes. 4/8/2015 • Unless there is a lot of code or data, the appropriate model is SMALL. • . MODEL directive should come before any segment definition. 72 CAP221 4/8/2015 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 73 CAP221 4/8/2015 Example .DATA WORD1 WORD2 MSG MASK 74 DW 2 DW 5 DB ‘ This is a message ‘ EQU 10010010B CAP221 4/8/2015 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 75 CAP221 4/8/2015 Declaration Syntax .STACK size An optional number that specifies the stack area size in bytes. 76 CAP221 4/8/2015 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. 77 CAP221 4/8/2015 Code Segment • It contains a program’s instructions. 78 CAP221 4/8/2015 Syntax .CODE name Optional name for the segment there is no need for a name in a SMALL program Why?? The assembler will generate an error 79 CAP221 4/8/2015 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 80 CAP221 4/8/2015 Example .CODE MAIN PROC ; main procedure body MAIN ENDP ; other procedures go here 81 CAP221 4/8/2015 Program Structure • A program has always the following general structure: .model .stack .data small 100h ;Select a memory model ;Define the stack size ; 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 82 CAP221 4/8/2015