Unformatted text preview: CHAPTER 8 Programming the Microprocessor
8.1 Modular Programming
8.1 Modular Programming
• The linker program: • programming modules are linked together into a complete program. 8.1.1 The Assembler and Linker
8.1.1 The Assembler and Linker
• The assembler program converts a symbolic source module (file) into a hexadecimal object file.
• Example 81: • The assembler program (ML) requires the source file name following ML
• The /Fl switch is used to create a listing file named NEW.LST. • The source listing file (.LST) contains
− the assembled version of the source file − its hexadecimal machine language equivalent.
• If a file is short enough (less than 64K) , it can be converted from an execution file to a command file (.COM)
– Must be originated at location 100H before it can execute
Must be no larger than 64K100H in length.
The ML program generates a command file if the tiny model is used with a starting address of 100H. • Example 82 shows the linker program protocol when it is used to link the files NEW, WHAT, and DONUT. – To involve the linker, type LINK at the DOS command prompt.
– ML not only links the files, but it also assembles them prior to linking.
– Note that before files are linked, they must first be assembled and they must be errorfree. 8.1.2 PUBLIC and EXTRN
8.1.2 PUBLIC and EXTRN • The PUBLIC and EXTRN directives are very important to modular programming. • PUBLIC – to declare that code labels , data labels , or segments name are available to other program modules.
• EXTRN (external) declares that labels are external to a module. – The EXTRN statement appears in both data and code segments to define labels as external to the segment.
– If data are defined as external, their sizes must be defined as BYTE, WORD, or DWORD. – If a jump or call address is external, it must be defined as NEAR or FAR.
– Example 74 Example 84
Example 84 Example 85
本本本本本本本 DATA3 本 DATA4 本本本
本 ES 本 DF 本本本本本本本本本本本 ES 本
DS 本 DF 本 0 DI 8.1.3 Macros
8.1.3 Macros • A macro is a group of instructions that perform one task.
• The difference between macro and procedure
– procedure is accessed via a CALL instruction ；
– a macro, and all the instructions defined in the macro, is inserted in the program at the point of usage. • Macro sequences execute faster than procedures – because there are no call and RET instruction to execute. • The MACRO and ENDM directives delineate a macro sequence. • Macro sequence must be defined before they are used in a program. • Local Variables in a Macro – A local variable is one that appears in the macro, but is not available outside the macro.
– Use the LOCAL directive to define a local variable.
– Example 79 .
– The LOCAL directive must immediately follow the MACRO directive. label: must begin label: must begin with a letter or @ $ _ ? 7.2 Using The Keyboard And Video Display
7.2 Using The Keyboard And Video Display
7.2.1 Reading the Keyboard with DOS Functions • This section uses INT 21H with various DOS function calls to read the keyboard.
• Data read from the keyboard are either in ASCIIcoded form or in extended ASCIIcoded form.
• Table 73 lists most of the extended ASCII codes.
• Table 17 in section 1.4 list ASCII codes. 7.2.1 Reading the Keyboard with DOS Functions
7.2.1 Reading the Keyboard with DOS Functions
• There are three ways to read the keyboard: The first method ( DOS Function 01H) reads a key and echoes (or displays) the key on the video screen.
– A second way ( DOS Function 06H) simply tests to see if a key is pressed.
• If it is, it reads the key
• Otherwise, it returns without any key – The third way ( DOS Function 09H) allows an entire character string to be read from the keyboard. • Reading a Key with Echo – Example 715 show a key is read from the keyboard and echoed (sent) back out to the video display by using a procedure called KEY. – DOS Function 01H • entry: AH=01H,
• exit: AL=ASCII character. if AL=0, the function call must be invoked again to read the extended ASCII character.
– It always echoes the character to the screen, even if it is an unwanted character.
– It responds to the controlC key combination, and exits to DOS if it is typed. – The procedure of Example 715 returns • with carry set (1) to indicate an extended ASCII character • with carry cleared (0) to indicate a normal ASCII character.
– When this procedure is called, the CALL instruction might be followed by a JC EXTENDED to process the extended ASCII character. • Reading a Key without an Echo – Function number 06H. This function reads a key without an echo to the screen.
• entry: AH=06H, DL=FFH (for key input ) or DL=ASCII char (for char display)
• exit: when DL=FFH, AL=ASCII char ; if AL=0, the function call must be invoked again to read the extended ASCII character.
– Also allows extended ASCII character.
– Does not respond to the controlC key combination. – Example 716 shows a procedure that uses function number 06H to read the keyboard.
– This performs as shown in Example 715, except to character is echoed to the video display.
– difference between Function call number 06H and 01H
• Function call number 06H returns the INT 21H, even if no key is typed;
• Function call number 01H waits for a key to be typed. 7.2.2 Writing to the Video Display with DOS 7.2.2 Writing to the Video Display with DOS Functions
• Video data can be displayed in a number of different ways:
– use function 02H or 06H for displaying one character at a time.
– or function 09H for displaying an entire string of characters
• Displaying One ASCII Character
– Both DOS functions 02H and 06H are explained together because they are identical for displaying ASCII data
– Example 718 shows how this function displays a carriage return (0DH) and a line feed (0AH) Macro substitution Macro substitution • Displaying a Character String ； DOS Function number 09H ；
– entry: • DS:DX address the character string.
• A character string is a series of ASCIIcoded characters • It ends with a $ (24H). – exit: no
– Example 719 shows how a message is displayed at the current cursor position on the video display. 7.2.3 Using BIOS Video Function Calls
7.2.3 Using BIOS Video Function Calls
• Video BIOS (basic I/O system) function call at INT 10H
– BIOS function calls vs DOS function calls • allow more control over the video display.
• be faster. – Video BIOS function number 03H: • read the cursor position. • entry: AH=03H, BH=page number;
• exit: DH=row, DL=column – Video BIOS function number 02H
• allows the cursor to be placed at any screen position.
• entry: BH=page number, DH=row, DL=column
• exit: no
– The page number in register BH should be 0 before setting the cursor position. • Most software does not normally access the other pages (17) of the video display. – The cursor position: 079, 024
• lefthand page column is column 0, progressing across a line to column 79. • Row 0 is the uppermost line, while row 24 is the last line on the screen. – Example 720: use INT 10H and INT 21H to clear screen. 8.3 DATA CONVERSIONS
8.3 8.3.1 Converting from Binary to ASCII • Conversion from binary to ASCII is accomplished in two ways:
– by the AAM instruction if the number is less than 100, or
– by a series of decimal divisions (divide by 10) • e.g. 07BFH>1983, 2A3CH>10812
• The AAM instruction converts the value in AX into a twodigit unpacked BCD number in AX.
– If the number in AX is 0062H (98 decimal), AX contains a 0908H after AAM executes.
– It is converted to ASCII code by adding a 3030H to AX
• Example 727 illustrates a program that uses the procedure DISP, which processes the binary value in AL (099) and displays it on the video screen as decimal • Example 728: the unsigned 16bit content of AX is converted to ASCII and displayed on the video screen.
• The algorithm for converting from binary to ASCII code is:
– Divide by the 10, then save the remainder on the stack as a significant BCD digit.
– Repeat step 1 until the quotient is a 0.
– Retrieve each remainder and add a 30H to convert to ASCII before displaying or printing.
• e.g. AX=7BFH=1983, – DX=0, DX:AX/10, > DX=3, AX=198, push 3
– DX=0, DX:AX/10, > DX=8, AX=19, push 8
– DX=0, DX:AX/10, > DX=9, AX=1, push 9
– DX=0, DX:AX/10, > DX=1, AX=0, push 1; pop 1,9,8,3 • This same scheme of dividing by 10 can be expanded to 2, 8,16 etc.
– For example, if AX is divided by 8 instead of 10, the number is displayed in octal. • e.g. AX=7BFH=1983, – DX=0, DX:AX/10, > DX=3, AX=198, push 3
– DX=0, DX:AX/10, > DX=8, AX=19, push 8
– DX=0, DX:AX/10, > DX=9, AX=1, push 9
– DX=0, DX:AX/10, > DX=1, AX=0, push 1; – pop 1,9,8,3 CX=4 8.3.2 Converting from ASCII to Binary
8.3.2 本本本 • The algorithm for converting from ASCII to binary is:
– 1. BX<0 – 2. read a char to AL, AL< AL30H – 3. BX< BX*10+AL
– 4. Repeat steps 2 and 3 until the character typed is not an ASCIIcoded number
• E.g. type ‘9’, ‘8’, ‘3’
• Example 729 illustrates a procedure (READN) used this algorithm. 本本本 本本本 BX<BX*10
BX<BX*10+AL 7.4 DISK FILES
7.4 DISK FILES • Data are stored on the disk in the form of files 7.4.3 Sequential File Access • All DOS files are sequential files
• A sequential file is stored and accessed from the beginning of the file toward the end. • File Creation: the INT 21H function call number 3CH
– AH = 3CH.
– DS:DX points to the file name;
• File name is a ASCIIZ string. e.g. “c:\dread\my.bak”, \0
• ASCIIZ string is a string ended with a null char (0).
– CX = the attribute of the file (or subdirectory).
• exit: if CF is set, AX= error code; otherwise, AX=file handle. – Before data can be written to this new file, the file must first be created. – Example 738 lists a short procedure that creates this new file on the disk. – Whenever a file is created, CX=attributes of the file.
– Table 76 lists and defines the attribute bit positions. • A logic 1 in a bit selects the attribute, • while a logic 0 does not. • Writing to a File(Function number 40H )
– Before writing to a file, the file must have been created or opened.
– entry: AH=40H
• BX = the file handle.
• CX = the number of bytes to be written.
• DS:DX = the address of the buffer.
• If an error occurs, the carry flag is set.
• If no error occurs, the carry flag is cleared, AX = number of bytes written to the file.
– Example 739: write all 256 bytes of BUFFER to the file. – Errors that occur for writes usually indicate that:
• the disk is full • there is some type of media error • Opening, Reading, and Closing a File
– To read a file, it must be opened first
– The DOS file handle must be used for reading, writing, and closing a file
– Example 740 lists a sequence of instructions:
• opens a file, • reads 256 bytes from the file into memory area BUFFER, • closes the file. • Open a file (Function number 3DH)
– entry: DS:DX=address of ASCIIZ string file name, AL=access code
• If AL = 00H, the file is opened for a read
• If AL = 01H, the file is opened for a write • If AL = 02H, the file is opened for a read or a write – exit: if CF=0, AX=file handle; otherwise, an error occurs. • Reading a File (Function number 3FH)
• BX = the file handle • CX = number of bytes to be read
• DS:DX = the address of a memory buffer to store file data. – Exit:
• if carry flag = 1, an error occurs. • otherwise, the AX = the number of bytes read from the file. • Closing a File (Function number 3EH)
– Entry: BX = the file handle;
– Exit: if carry flag = 1, AX=error code. • Always be certain to close a file after it is read or written
– If a file is left open, some serious problems can occur that can actually destroy the disk and all its data • The File Pointer – When a file is opened, written, or read, the file pointer addresses the current location in the sequential file.
• When a file is opened, the file pointer always addresses the first byte of the file
• If a file is 1024 bytes long, and a read function reads 1023 bytes, – the file pointer addresses the last byte of the file, but not the end of the file.
– The file pointer is a 32bit number that addresses any byte in a file. • Move file pointer (function number 42H) – entry: BX=file handle; CX:DX=number of bytes to move;
• AL=move technique:
– from the start of the file (AL = 00H),
– from the current location (AL = 01H),
– Or from the end of the file (AL = 02H). – exit:
• if CF is set, AX=error code;
• otherwise, CX:DX=number of bytes that pointer moved. • Suppose that you want to append the file with 256 bytes of new information. – If you attempt to write without moving the file pointer to the end of the file, the new data will overwrite the first 256 bytes of the file.
• Example 741 shows a program:
– It opens a file, moves the file pointer to the end of the file, – It writes 256 bytes of data, and then closes the file. – This appends the file with 256 new bytes of data. 7.6 Interrupt Hooks
7.6 Interrupt Hooks ； 7 ；；；； • Hook are used to tap into or intercept the interrupt structure of the microprocessor. 7.6.1 Intercepting an Interrupt • In order to intercept an interrupt, we must installing an interrupt handle through a hook ；
• DOS function call number 35 ； read the current interrupt vector.
– entry: AL = vector type number
– exit: ES:BX=address stored at vector.
• DOS function call number 25 ； change the address of the current vector.
– entry: • AL = vector type number;
• DS:DX=address of new interrupt procedure; • Example 748: installing an interrupt handle through a hook. Example 748
Example 748 ； 7 ；；；； ; A sequence of instructions that show the installation
; or a new interrupt for vector 0 (divide error).
; Note this is not a complete program
; old interrupt vector
NEW PROC FAR
; new interrupt procedure
; do nothing interrupt
NEW ENDP MAIN:
DS ； 7 ；；；；
MOV AX, CS ; address CS with MOV DS, AX
; get vector 0 address
MOV AX, 3500H
; save vector address at ADDR
MOV WORD PTR ADDRESS, BX
MOV WORD PTR ADDRESS+2, ES
; install new interrupt vector 0 address
MOV AX, 2500H
MOV DX, OFFSET NEW
; other installation software continues here ...
View Full Document
- Spring '09
- Computer Science, X86 assembly language