UNIT 4. Modular Programming

Similar documents
Intel 8086: Instruction Set

db "Please enter up to 256 characters (press Enter Key to finish): ",0dh,0ah,'$'

Lecture 16: Passing Parameters on the Stack. Push Examples. Pop Examples. CALL and RET

8086 ALP TOOLS (CH 2) CHAPTER 2

EC 333 Microprocessor and Interfacing Techniques (3+1)

PESIT Bangalore South Campus

ORG ; TWO. Assembly Language Programming

IBM PC Hardware CPU 8088, Pentium... ALU (Arithmetic and Logic Unit) Registers. CU (Control Unit) IP.

Experiment 8 8 Subroutine Handling Instructions and Macros

EEM336 Microprocessors I. Data Movement Instructions

Basic Assembly SYSC-3006

Chapter 3: Addressing Modes

SRI VENKATESWARA COLLEGE OF ENGINEERING AND TECHNOLOGY DEPARTMENT OF ECE EC6504 MICROPROCESSOR AND MICROCONTROLLER (REGULATION 2013)

PHY4635/5635 Spring Lecture 8: Program Control Instructions

Week /8086 Microprocessor Programming II

.code. lea dx,msg2. Page 1/8. Problem 1: Programming in Assembly [25 Points]

Q. State and Explain steps involved in program development. [w-08, w-10, s-12, w-11]

We will first study the basic instructions for doing multiplications and divisions

Arithmetic Instructions

Microprocessor. By Mrs. R.P.Chaudhari Mrs.P.S.Patil

Signed number Arithmetic. Negative number is represented as

SPRING TERM BM 310E MICROPROCESSORS LABORATORY PRELIMINARY STUDY

reply db y prompt db Enter your favourite colour:, 0 colour db 80 dup(?) i db 20 k db? num dw 4000 large dd 50000

CONTENTS. 1. Display a Message Display a one Digit Number Accept a Character from keyboard and display the character 4

PESIT Bangalore South Campus Hosur road, 1km before Electronic City, Bengaluru -100 Department of Electronics and Communication

Week /8086 Microprocessor Programming

Kingdom of Saudi Arabia Ministry of Higher Education. Taif University. Faculty of Computers & Information Systems

Week /8086 Microprocessor Programming I

Computer Architecture and System Software Lecture 07: Assembly Language Programming

INSTRUCTOR: ABDULMUTTALIB A. H. ALDOURI

Ex: Write a piece of code that transfers a block of 256 bytes stored at locations starting at 34000H to locations starting at 36000H. Ans.

Summer 2003 Lecture 4 06/14/03

EC-333 Microprocessor and Interfacing Techniques

Assembling, Linking and Executing 1) Assembling: .obj obj .obj.lst .crf Assembler Types: a) One pass assembler:


ELEC 242 Time Delay Procedure

Topics Introduction to Microprocessors. Chapter 5 Macros and modules. What is macro? How to use macro? (I) How to use macro?

SPRING TERM BM 310E MICROPROCESSORS LABORATORY PRELIMINARY STUDY

COE 205 Lab Manual Experiment N o 12. Experiment N o Using the Mouse

Experiment #5. Using BIOS Services and DOS functions Part 1: Text-based Graphics

ADVANCE MICROPROCESSOR & INTERFACING

Computer Architecture and System Software Lecture 06: Assembly Language Programming

Computer Architecture 1 ح 303

Assembler Programming. Lecture 10

VARDHAMAN COLLEGE OF ENGINEERING (AUTONOMOUS) Shamshabad, Hyderabad

6/20/2011. Introduction. Chapter Objectives Upon completion of this chapter, you will be able to:

Assignment no:4 on chapter no :3 : Instruction set of 8086

Objectives. ICT106 Fundamentals of Computer Systems Topic 8. Procedures, Calling and Exit conventions, Run-time Stack Ref: Irvine, Ch 5 & 8

Computer Organization & Assembly Language Programming. CSE 2312 Lecture 15 Addressing and Subroutine

Experiment 3 3 Basic Input Output

Mr. Sapan Naik 1. Babu Madhav Institute of Information Technology, UTU

EEM336 Microprocessors I. Addressing Modes

LABORATORY WORK NO. 7 FLOW CONTROL INSTRUCTIONS

BLDEA S V.P. DR. P.G. HALAKATTI COLLEGE OF ENGINEERING & TECHNOLOGY, VIJAYAPURA

Module 3 Instruction Set Architecture (ISA)

Mnem. Meaning Format Operation Flags affected ADD Addition ADD D,S (D) (S)+(D) (CF) Carry ADC Add with ADC D,C (D) (S)+(D)+(CF) O,S,Z,A,P,C

CS-202 Microprocessor and Assembly Language

Assignment 3. Problem Definition:

The Stack. Lecture 15: The Stack. The Stack. Adding Elements. What is it? What is it used for?

EC 333 Microprocessor and Interfacing Techniques (3+1)

8088/8086 Programming Integer Instructions and Computations

Transfer of Control. Lecture 10 JMP. JMP Formats. Jump Loop Homework 3 Outputting prompts Reading single characters

SHEET-2 ANSWERS. [1] Rewrite Program 2-3 to transfer one word at a time instead of one byte.

Addressing Modes on the x86

Assembly Language Each statement in an assembly language program consists of four parts or fields.

3.1 DATA MOVEMENT INSTRUCTIONS 45

9/25/ Software & Hardware Architecture

Microcontroller Intel [Instruction Set]

Lab 2: Introduction to Assembly Language Programming

Arithmetic and Logic Instructions And Programs

CS401 Assembly Language Solved MCQS From Midterm Papers

Memory Organization. 27 December 2016 Pramod Ghimire. Slide 1 of 21

A4 Sample Solution Ch3

SN8F5000 Family Instruction Set

Program Control Instructions

Microcomputer Architecture..Second Year (Sem.2).Lecture(2) مدرس المادة : م. سندس العزاوي... قسم / الحاسبات

2003 LXI H, 42F2H ; this instruction store 42F2 in to the HL pair POP H ; store data from top of the stack to HL pair

INSTRUCTOR: ABDULMUTTALIB A. H. ALDOURI

ELEC 242 Using Library Procedures

LABORATORY WORK NO. 8 WORKING WITH MACROS AND LIBRARIES

Microprocessors & Assembly Language Lab 1 (Introduction to 8086 Programming)

BAHAR DÖNEMİ MİKROİŞLEMCİLER LAB3 FÖYÜ

Defining and Using Simple Data Types

Assembly Language. Dr. Esam Al_Qaralleh CE Department Princess Sumaya University for Technology. Overview of Assembly Language

Chapter 3. Assembly Language Programming with 8086

It is possible to define a number using a character or multiple numbers (see instruction DB) by using a string.

CS401 Assembly Language Solved Subjective MAY 03,2012 From Midterm Papers. MC

Experiment N o 8. String Handling Instructions

Islamic University Gaza Engineering Faculty Department of Computer Engineering ECOM 2125: Assembly Language LAB

CSCI516: Program 1 - October 11, 2010 The Program is due: October 25, 2010 in the beginning of the class

Lecture 9. INC and DEC. INC/DEC Examples ADD. Arithmetic Operations Overflow Multiply and Divide

Intel 8086 MICROPROCESSOR. By Y V S Murthy

EXPERIMENT WRITE UP. LEARNING OBJECTIVES: 1. Get hands on experience with Assembly Language Programming 2. Write and debug programs in TASM/MASM

The registers(di,si) are automatically incremented or decremented depending on the value of the direction flag:

16.317: Microprocessor Systems Design I Fall 2013

Lecture (07) x86 programming 6

CC411: Introduction To Microprocessors

FACULTY OF ENGINEERING LAB SHEET

ECOM Computer Organization and Assembly Language. Computer Engineering Department CHAPTER 7. Integer Arithmetic

Summer 2003 Lecture 15 07/03/03

Transcription:

1 UNIT 4. Modular Programming Program is composed from several smaller modules. Modules could be developed by separate teams concurrently. The modules are only assembled producing.obj modules (Object modules). Each module is produced from a separate Assembly Language program. The.OBJ modules so produced are combined using a LINK program. Another concept that is useful is that of a Library of Object Modules. Frequently used procedures could be assembled into object modules and these object modules are placed in a Library file that is linked into the application. Note that only the required object modules are pulled from the Library to be linked to the final application. Ex: Let us say, in Module A, we defined num DB 10 DUP (?) In Module B, we wish to access BUF1, say as in MOV DX, OFFSET num num is not defined in Module B. Thus, when assembling Module B, we will get the assembly error of Undefined Symbol. Note that the symbol is actually defined in Module A. But, the two modules are assembled independently! Problem: How to make BUF1, defined in Module A, accessible to Module B? Solution: Declare num as public in Module A (Interpretation: Defined in this module, may be used in other modules.) Declare num as external in Module B (Interpretation: Used in this module, but defined in some other module.) num becomes a global symbol. Its use is resolved by a Linker program. What happens if num is declared as external in one module; but Linker does not find its definition in any of the modules being linked together? This will be a Link Error, something like: Globally Unresolved Symbol Properly used, Public and Extrn facilities allow modules to communicate with each other, which is essential for Modular Programming. 4.1 PUBLIC and EXTRN Directives: The following example illustrates the use of Public and External directives to achieve communication among independently assembled modules. PROG1.ASM, defines two symbols BUF1 and BUF2 and declares them as PUBLIC. It also defines a Far Procedure called RDKEY and declares this also as PUBLIC. Such a declaration allows these symbols to be accessed from other modules. Thus, BUF1, BUF2 and RDKEY can be accessed from other modules. File 1: PROG1.ASM.MODEL SMALL.DATA PUBLIC BUF1 PUBLIC BUF2 BUF1 DB 10 DUP (?)

2 BUF2 DW 10 DUP (?).CODE.STARTUP END PUBLIC RDKEY RDKEY PROC FAR ; function definition here MOV AH, 01 INT 21H RDKEY ENDP In another program PROG2.ASM, we make use of the symbols BUF1, BUF2 and RDKEY. We declare them as EXTRN. Such a declaration indicates that the definitions for these symbols are not in this module; rather they are expected to be defined in other modules which will be specified during LINK time. Note that the type of the EXTRN data items must be declared for proper assembly. Similarly, the FAR/NEAR nature of an EXTRN procedure also must be declared for the Assembler to generate correct code. File 2: PROG2.ASM.MODEL SMALL.DATA EXTRN BUF1:BYTE EXTRN BUF2:WORD.CODE EXTRN RDKEY:FAR.STARTUP MOV DX, OFFSET BUF1 MOV CX, 10 L1: CALL RDKEY STOSB LOOP L1 MOV BUF2, AX.EXIT END We now have 2 Files: PROG1.ASM and PROG2.ASM These can be assembled and Linked by the following command ML PROG1.ASM PROG2.ASM Now assemble the two programs separately, getting the two.obj files. MASM PROG1; MASM PROG2; Run LINK utility and specify the two.obj files as inputs. LINK PROG1.OBJ PROG2.OBJ 4.2 LIBRARIES: Frequently used procedures for a given application domain may be placed in a Library File as.obj files. The Library file can be specified at LINK time.

3 Only the required.obj files are extracted from the Library File and linked to the program. Thus, Libraries provide a powerful reuse mechanism. LIB Command: The LIB command provides the following facilities: Create a new Library file Add.OBJ file to a Library file. Delete.OBJ file from a Library file. Replace an existing.obj file in the Library with another.obj file with the same name (equivalent to Delete followed by Add) The LIB command is used as follows: LIB library file name If the named Library file does not exist, the system prompts whether to create? Type Y It prompts for operation (operation could be specified on command line also). The Operation can be: + (add) ; - (remove) ; -+ (replace) Example: Create a Library file called MYP1.LIB and add the module PROG1 to the library: > LIB MYP1.LIB ; some messages are displayed Library file does not exist. Create? Y Operations: + PROG1 List File: MYP1 To the Library file called MYP1.LIB, add the module PROG2: > LIB MYP1.LIB ; some messages are displayed Operations: +PROG2 > To the Library file called MYP1.LIB add the module PROG3: >LIB MYP1.LIB ; some messages are displayed Operations: +PROG3 > Alternatively, the 3 modules could be added to the Library file as shown below: >LIB MYP1.LIB ; some messages are displayed from the utility Library file does not exist. Create? Y Operations: PROG1 + PROG2 + PROG3 List File: MYP1 > From the Library file called MYP1.LIB, remove the module PROG2: > LIB MYIO1.LIB Copyright messages etc from the utility Operations: -PROG2 >

4 List file shows: Sizes and names of the files in the Library Public labels available in the Library Once we create Library files, we can use them to link the required modules into the application program by specifying the Library files to the Linker. With ML or with LINK, specify the Library files required in response to the prompt Libraries [.lib]: Library files have.lib as the default extension. 4.3 Procedures Procedure or a subroutine or a function is a key concept for modular programming, the essential way to conquer complexity. A procedure is a reusable set of instructions that has a name. Only one copy of the procedure is stored in the memory; and it can be called as many times as needed. As only one copy is stored, it saves memory; but has execution time overhead for the call and return operations. Macros are faster but consume more space. CALL transfers control to the procedure like with a jump; but unlike a jump, procedure has a RETURN instruction which returns control to the instruction following the CALL instruction! In order to implement such a return, the necessary information is stored on a stack, before transferring control to the procedure. Further, nested procedures calls are possible. In other words, Procedure A can call Procedure B which in turn calls Procedure C. After completing Procedure C, control returns to Procedure B and after completing Procedure B, control returns to Procedure A. Logically, such a nesting of calls can be to any level, though in practice Assemblers impose implementation-dependent limits on the nesting depth. It is also possible for a Procedure to call itself (a recursive procedure). Of course, to avoid infinite regress, the procedure would have an alternative that would not involve recursion. Examples of recursive procedures are described in later sessions. We see that return addresses are known in one order and are used for implementing return in exactly the reverse order. Thus a Stack would be the most convenient data structure for storing return addresses Procedure - Related Instructions/Directives: A procedure may be in the same code segment as that of the main program (Intrasegment). In such a case, we specify only IP as relative distance or indirectly as actual value. This is known as NEAR CALL. A procedure may be in a different code segment (Inter segement). In such a case, we need to specify both IP and CS (directly or indirectly). This is known as a FAR CALL In program, procedure starts with PROC directive and ends with ENDP directive. Each directive follows the name of the procedure. PROC directive is followed by the type of procedure: NEAR or FAR. NEAR or FAR can be followed by USES statement. USES statement allows specification of registers which are automatically pushed onto the stack and popped from the stack within the procedure.

5 Near CALL Instruction: Similar to Near Jump except that current IP is saved on the stack before transferring control to the new IP with CS remaining the same. Displacement is specified as 16 bit signed integer. Target range is thus -32768 bytes to +32767 bytes and consequently, target can be anywhere in the current code segment. This Instruction is 3 Byte long Main program:.... CALL MULT.. ; calling a procedure. Transfer control to procedure named as MULT ; procedure definition MULT PROC NEAR USES BX MOV AX, 1 ADD AX, BX RET MULT ENDP CALL SR1 FAR CALL Instruction: FAR CALL is like FAR JMP in the sense that it can call a procedure available anywhere in the code space. In this case, the target address is directly specified as new CS:IP. Both current IP and CS are saved on the stack and then control is transferred to the new CS:IP The instruction is 5 Byte long. The first byte specifies the opcode, the next two bytes specify the new IP value and the next two bytes specify the new CS value. The format is shown below: OPcode IP CS E8 Low Byte High Byte Low Byte High Byte Example: SUM1 PROC FAR SUM1 ENDP

6 Now, a CALL to SUM1 is assembled as FAR CALL. CALL with Register Operands: As with JMP, 16-Bit register may be used as the operand for the CALL instruction. (Indirect CALL) Again, as with JMP, contents of the register are transferred directly into IP (not relative displacement). This is always a Near CALL. Example: Assume BX = 0080H. Now the execution of the instruction: CALL BX ; calls the procedure at 0080H in the current code segment (Near Call). Indirect CALL Using Index: Like the corresponding JMP instruction, this instruction uses [ ] form of addressing to directly access a table of CALL addresses. This form is called Indirect Memory CALL also. Example: CALL TABLE [SI] Fetch the word, using indexed addressing, at the offset of TABLE [SI] from the current code segment and CALL the near procedure at that address. FAR PTR directive indicates a far CALL (the table is assumed to contain double words giving CS, IP values) Otherwise a near CALL is indicated. (the table is assumed to contain words giving IP values) Example: CALL FAR PTR [SI] Fetch the double word, using indexed addressing, at the offset of [SI] from the current code segment and CALL the far procedure at that address. Return from Procedure: We use a RET instruction to return from the called procedure. The control returns to the instruction following the CALL instruction in the calling program. Corresponding to the two varieties of CALL instructions (near & far), two forms of RET instructions (near & far) exist. Near RET instruction pops a 16-Bit word from the stack and places it in the IP. Far RET instruction pops two 16-Bit words from the stack and places them in IP & CS. In ALP, RET is written within the procedure, before the ENDP directive and the Assembler will automatically select the proper (Near or Far) RET instruction! Another form: RET immediate value Example: RET 6 In this case, after popping return address from the stack, the specified number (in this case, 6) is added to SP, effectively removing some (in this case 3) words from the stack! These words could have been pushed onto stack before calling. This is the scheme followed by compilers. 4.4 MACRO Macros provide several powerful mechanisms useful for the development of generic programs.

7 MACRO is a group of instructions with a name. When a macro is invoked, the associated set of instructions is inserted in place into the source, replacing the macro name. This macro expansion is done by a Macro Preprocessor and it happens before assembly. Thus the actual Assembler sees the expanded source! We could consider the macro as shorthand for a piece of text. Macros Vs Procedures: 1) Procedure: Only one copy exists in memory. Thus memory consumed is less. Called when required; Return address (IP or CS:IP) is saved on stack before transferring control to the subroutine thro CALL instruction. It should be popped again when control comes back to calling program with RET instruction. Execution time overhead is present because of the call and return instructions. If more lines of code, better to write a procedure 2) Macro: When a macro is invoked, the corresponding code is inserted into the source. Thus multiple copies of the same code exist in the memory leading to greater space requirements. However, there is no execution overhead because there are no additional call and return instructions. The code is in-place. Good if few instructions are in the Macro body. No use of stack for operation 4.1 MACRO Definition: A macro has a name. The body of the macro is defined between a pair of directives, MACRO and ENDM. Examples of Macro Definitions: ; Definition of a Macro named SAVE SAVE MACRO PUSH AX PUSH BX PUSH CX ENDM ; Another Macro named RETRIEVE is defined here RETRIEVE MACRO POP CX POP BX POP AX ENDM Examples of Macro usage: The following examples illustrate the use of macros. We first show the source with macro invocation and then show how the expanded source looks.

8 Program with macro invocations: SAVE MOV CX, DA1 MOV BX, DA2 ADD AX, BX RETRIEVE ; invoke macro using the name ; invoke macro When the Macro Preprocessor expands the macros in the above source, the expanded source looks as shown below: PUSH AX PUSH BX PUSH CX MOV CX, DA1 MOV BX, DA2 ADD AX, BX ADD AX, CX MOV DA2, AX POP CX POP BX POP AX Expanded MACRO at the place of invocation Expanded MACRO at the place of invocation Note how the macro name is replaced by the associated set of instructions. Thus, macro name does not appear in the expanded source code. In other words, the actual Assembler does not see the macros. What gets assembled is the expanded source. Body of the macro gets substituted at the place where the macro name appears in the program..asm file with Macros Macro Preprocessor.ASM file with Macro Expanded.EXE file Assemble and Link 4.1.1 MACROS with Parameters: A macro can be defined with parameters. These are dummy parameters. When the macro is invoked, we provide the actual parameters. During the macro expansion, the dummy parameters are replaced by the corresponding actual parameters. The association between the dummy and actual parameters is positional. Thus the first actual parameter is associated with the first dummy parameter, the second actual parameter with the second dummy one and so on. Example: where a Macro named COPY is defined with two parameters called A and B. Example: COPY MACRO x, y ; macro named COPY with 2 parameters PUSH AX MOV AX, x MOV b, AX POP AX ENDM

9 The macro is invoked in the following code with actual parameters as VAR1 and VAR2. Thus during the macro expansion, the parameter A is replaced by VAR1 and the parameter B is replaced by VAR2. COPY VAR1, VAR2 The expanded code is: PUSH AX MOV AX, VAR2 MOV VAR1, AX POP AX Local Variables in a Macro: Assume that a macro definition includes a label Next as in the example: READ MACRO num PUSH DX Next: MOV AH, 06 MOV DL, 0FFH INT 21H JZ Next ;; No key, try again MOV num, AL POP DX ENDM If READ macro is invoked more than once, as in READ VAR1 READ VAR2 assembly error!!! The problem is that the label Next appears in the expansion of READ VAR1 as well as in the expansion of READ VAR2. In other words, the Assembler sees the label Next at two different places and this results in the Multiple Definition error! SOLUTION: Define Next as a local variable in the macro. READ MACRO num LOCAL Next PUSH DX Next: MOV AH, 06 MOV DL, 0FFH INT 21H JZ Next ;; No key, try again MOV num, AL POP DX ENDM Now, in each invocation of READ, the label Next will be replaced automatically, with a unique label of the form?? xxxx ; where xxxx is a unique number generated by Assembler. This eliminates the problem of multiple definitions in the expanded source. With the use of local variable as illustrated above, READ VAR1 gets expanded as: PUSH DX??0000: MOV AH, 06 MOV DL, 0FFH INT 21H

10 JZ??0000 ;; No key, try again MOV VAR1, AL POP DX Subsequently, if we write READ VAR2 it gets expanded as: PUSH DX??0001: MOV AH, 06 MOV DL, 0FFH INT 21H JZ??0001 ;; No key, try again MOV VAR2, AL POP DX Note how each invocation of the READ macro gets expanded with a new and unique label, generated automatically by the Assembler, in place of the local variable Next. Further, note that LOCAL directive must immediately follow the MACRO directive. Another feature to note is that Comments in Macros are preceded by ;; (two semicolons), and not as usual by ; (a single semicolon). File of Macros: We can place all the required Macros in a file of its own and then include the file into the source. Ex: Suppose the Macros are placed in D:\MYAPP\MYMAC.MAC In the source file, we write INCLUDE D:\MYAPP\MYMAC.MAC Summary: Modular programming techniques simplify the software development process MACROS have very powerful features. Used properly, they can reduce effort required to develop large and complex programs. Further, Macros make it easy to develop Generic Programs which can be easily adapted for specific applications. Expertise with Modular programming techniques and Macros is essential for developing industry-strength large scale software in Assembly Language. Code Conversions: ASCII to Binary Binary to ASCII BCD to 7-Segment Code Data Conversion may be based on Algorithm Look Up Table 1) Converting from Binary to ASCII: In many contexts, for ex, when displaying a number on the screen, we must produce a sequence of ASCII characters representing the number to be displayed. Thus the given number must be converted to a string of equivalent ASCII characters.

11 Example: Binary number: 0100 0011 = 43H = 67 D To display this on the screen, we need to convert this binary number in to Two ASCII characters, 6 and 7. ASCII code for character 6 is 36H and ASCII code for character 7 is 37H. So, we need to produce 36H and 37H as output given 43H as input. Another Example: Binary number: 0000 0010 0100 0011 = 0243H = 579 D To display this on the screen, we need Three ASCII characters, 5, 7 and 9. ASCII code for character 5 is 35H, ASCII code for character 7 is 37H, and ASCII code for character 9 is 39H So, we need to produce 35H, 37H and 39H as output given 0243H as input a) Binary to ASCII Algorithm: Example: Binary number: 0000 0010 0100 0011 = 579 D Divide 579 by 10 ; Quotient = 57 ; Remainder = 9, Save 9 Divide 57 by 10; Quotient = 5 ; Remainder = 7, Save 7 Divide 5 by 10; Quotient = 0 ; Remainder = 5, Save 5 Quotient = 0 Conversion Complete. Remainders saved in the order of 9, 7, and 5. Retrieve remainders in the order of 5, 7, and 9. (As the order of retrieval is the reverse of the order of producing these digits, the most convenient technique is to Save & Retrieve the digits using Stack) While retrieving, add 30H to convert the digit to ASCII code and then display it (or print it, or save it ) Thus the algorithm is: While the number is not equal to 0: Divide the number by 10; Push the remainder digit on the stack; Set number <- quotient While stack not empty Pop a digit from the stack Add 30H to covert it to ASCII and display it Return. This algorithm is implemented in the following program: Binary to ASCII Program: ; Input : 16-Bit Binary Number in AX ; Output: Equivalent ASCII displayed on screen.model TINY.CODE.STARTUP MOV AX, 2A5H ; Test value CALL B2A ; call procedure Binary to ASCII and Display Mov ah, 4ch ; terminate main program

12 Int 21h B2A PROC NEAR PUSH DX PUSH CX PUSH BX MOV CX, 0 ; Count of ASCII digits, Initialized to 0 MOV BX, 10 ; Divisor is 10 back1: MOV DX, 0 ; Dividend in DX, AX. So set DX = 0 DIV BX ; Divide by 10 PUSH DX ; Save remainder digit on the stack INC CX ; Increment digit count Notes: OR AX, AX ; Conversion completed? (Quotient, i.e AX = 0?) JNZ back1 ; No, continue division ; Conversion is complete as quotient in AX = 0 ; Count of remainder digits is in CX back2: POP DX ; Retrieve remainder in DL ADD DL, 30H ; Convert to ASCII MOV AH, 06H ; Console Display Function INT 21H ; DOS Service, display digit LOOP back2 ; Clean up & Return. AX is destroyed B2A POP POP POP RET ENDP END BX CX DX ; Repeat for all digits DIV instruction requires the 32-bit dividend in the register pair DX and AX. The number to be converted (and subsequently, the quotient) is in AX. So, DX is cleared to 0 to set up the correct dividend. As the digits are pushed on to the Stack, their count maintained in CX is incremented. Thus the POPs occur in a loop controlled by CX. In the same loop, as we POP each digit, 30H is added to produce the output in ASCII. b) Another Method for Binary to ASCII Conversion: When the input number is less than 100, an alternative, simpler method exists. AAM (ASCII Adjust AX After Multiplication) instruction converts value in AX in to 2-Digit Unpacked BCD and leaves it in AX. Example: AX = 0027H (39 Decimal)

13 Execute AAM ; Now, AX = 0309H ; This is Unpacked BCD. Now, add 3030H to AX to get 3339H ; This is Packed ASCII representation. Separate the two bytes (unpack) to get the two ASCII characters representing the given number (33H and 39H). Works only when the number is less than 100 as the maximum unpacked BCD that we can have in the AX register is 0909H only. The following program is developed based on this idea. ; Input : Binary Number in AL, Assumed <100 ; Output: Equivalent ASCII displayed on screen.model TINY.CODE.STARTUP MOV AL, 2AH ; Test value CALL B2A ; Binary to ASCII and Display.EXIT B2A PROC NEAR PUSH DX MOV AH, 0 ; AX = Number AAM ; AX = Unpacked BCD ADD AX, 3030H ; Convert to ASCII PUSH AX ; Now, unpack and display MOV DL, AH ; First Digit MOV AH, 06H ; Display Function INT 21H ; Display first digit POP AX ; Retrieve value MOV DL, AL ; Second Digit MOV AH, 06H ; Display Function INT 21H ; Display second digit ; Clean up & Return. AX is destroyed POP DX RET B2A ENDP END Refinements: Suppose the input is: AL = 7H. What is displayed is 07 Can we replace leading 0 with a blank so that the display looks better? Thus, instead of 07, the display should be 7. Yes. We need to check if the first digit is 0. If so, display 20H (blank); else, display the digit. We need to modify the previous program to incorporate this check for a leading 0. Old Code for displaying first digit: MOV DL, AH ; First Digit MOV AH, 06H ; Display Function

14 INT 21H ; Display first digit Revised Code for displaying first digit: ADD AH, 20H ; 20h is the ASCII code for blank CMP AH, 20H ; First Digit = 0? JZ B2A1 ; Display blank (ASCII Code is 20H) ADD AH, 10H ; Add 10H more to get the correct ASCII Code for the digit B2A1: MOV DL, AH ; First Digit MOV AH, 06H ; Display Function INT 21H ; Display first digit Incorporating this change, the program will be as shown below: ; Input : Binary Number in AL, Assumed <100 ; Output: Equivalent ASCII displayed on screen.model TINY.CODE.STARTUP MOV AL, 2AH ; Test value CALL B2A ; Binary to ASCII and Display Mov ah, 4ch Int 21h B2A PROC NEAR PUSH DX MOV AH, 0 ; AX = Number AAM ; AX = Unpacked BCD ADD AX, 3030H ; Convert to ASCII PUSH AX ; Now, unpack and display ADD AH, 20H CMP AH, 20H ; First Digit = 0? JZ back1 ; YES. So, display a blank (ASCII Code is 20H) ADD AH, 10H ; No, we have already added 20H. Add 10H more to get the correct ASCII Code for the digit back1: MOV DL, AH ; First Digit itself if not 0, Or Blank (if 0) MOV AH, 06H ; Display Function INT 21H ; Display first digit POP AX ; Retrieve value MOV DL, AL ; Second Digit MOV AH, 06H ; Display Function INT 21H ; Display second digit ; Clean up & Return. AX is destroyed POP DX RET B2A ENDP END 2) ASCII to Binary Algorithm: In many contexts, for example, when reading a number from the key board, we get a sequence of ASCII characters representing the number. This string of ASCII characters must be converted to the equivalent number for further processing.

15 Example: Assume that ASCII character sequence 156 is the input. 3 characters, 1, 5, and 6 ; with codes as 31H, 35H, and 36H. Converted Binary Value must be: 0000 0000 1001 1100 = 009CH = 156 (decimal) Conversion Procedure: Start with (Binary) Result = 0 First ASCII digit 31H; Subtract 30H to get corresponding BCD digit 01H. Result = Result * 10 + Next BCD Digit Result = 0 * 10 + 01 = 0000 0000 0000 0001 Next ASCII digit 35H; Subtract 30H to get corresponding BCD digit 05H. Result = Result * 10 + Next BCD Digit Result = 01 * 10 + 05 = 0000 0000 0000 1111 Next ASCII digit 36H; Subtract 30H to get corresponding BCD digit 06H. Result = Result * 10 + Next BCD Digit Result = 15 * 10 + 06 = 0000 0000 1001 1100 ASCII digits exhausted. So, conversion is completed. Final Result = 0000 0000 1001 1100 = 009CH = 156 (decimal) Based on the above ideas, the following program implements the ASCII to Binary Conversion. ; ASCII to Binary Program ; ASCII characters representing a number are read from key board. ; The first non-digit character (any character other than 0 through 9) typed ; signals the end of the number entry ; Result returned in AX, which is then stored in memory location TEMP. ; Result assumed not to exceed 16 bits! ; Program can be modified to accept larger numbers by implementing ; 32- bit addition..model SMALL.DATA TEMP DW?.CODE.STARTUP CALL RDNUM MOV TEMP, AX.EXIT RDNUM PROC NEAR PUSH BX PUSH CX MOV CX, 10 ; Multiplier is 10 MOV BX, 0 ; Result initialized to 0 RDN1: MOV AH, 1 ; Read Key with Echo INT 21H ; Check the character. If less than 0 or greater than 9 Number entry is over CMP AL, 0 JB RDN2 CMP AL, 9

16 JA RDN2 ; Is digit. Update Result SUB AL, 30H ; BCD Digit PUSH AX MOV AX, BX MUL CX MOV BX, AX ; Result = Result * 10 POP AX MOV AH, 0 ; AX = Current Digit ADD BX, AX ; Update Result JMP RDN1 ; Repeat ; Non- digit. Clean Up and Return RDN2: MOV AX, BX ; Result in AX POP CX POP BX RET RDNUM ENDP END Notes: The constant multiplier 10 is held in the register CX. In the procedure RDNUM, the result is accumulated in the register BX and at the end, it is moved in to register AX. The result in AX is moved, in the calling program, in to the memory location TEMP. The BCD digit is in AL. AH is cleared to 0 so that the 16-bit value in AX represents the correct value and thus can be added directly to the accumulating result in BX. This part of the code must be changed to implement 32-bit addition if larger results are to be supported. Using Look Up Tables for Data Conversion: Often, a look-up table simplifies data conversion. XLAT can be used if table has up to 256 byte-entries Value to be converted is used to index in to the table containing conversion values. As an example, we will demonstrate BCD to 7-Segment code conversion. 1) BCD to 7-Segment Code Conversion: In many applications, we need to display BCD values on a 7-Segment display. The 7 segments and the decimal point are controlled by 8 bits, with one bit controlling one segment or the decimal point. The bit value required to switch on a segment depends on whether the device is of a Common Anode type or Common Cathode type. Here, we are assuming a Common Anode type. Thus the segment will be ON if the corresponding controlling bit is 1 and will be off if the bit is 0. Based on the digit to be displayed, we must determine the segments that must be ON and the ones that must be OFF. Based on the above logic, the following FAR Procedure returns the 7-Segment code in the AL register, corresponding to the BCD digit provided as input parameter in the AL register before calling the procedure. ; BCD to 7-Segment Code Program

17 ; Input: AL = BCD Digit ; Output: AL = 7-Segment code. BT7SEG PROC FAR PUSH BX MOV BX, OFFSET TABLE XLAT CS: TABLE POP BX RET TABLE DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ; code corresponds to digits 0 to 9 BT7SEG ENDP Notes: XLAT instruction does not normally contain an operand. Here we are using the operand (TABLE). It is a dummy operand! It is being used here only to specify segment override. XLAT uses DS by default. Here the table is in CS. So segment override prefix is being specified.