AM2: Programming with Contemporary Instruction Set

Similar documents
AM2: Protected-Mode Programming

Assembly Language for Intel-Based Computers, 4 th Edition. Chapter 5: Procedures. Chapter Overview. The Book's Link Library

Lab 5: Input/Output using a Library of Procedures

Assembly Language for Intel-Based Computers, 4 th Edition

Assembly Language. Lecture 5 Procedures

Assembly Language. Lecture 5 Procedures

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

Assembly Language for Intel-Based Computers, 4 th Edition. Chapter 5: Procedures

Marking Scheme. Examination Paper Department of CE. Module: Microprocessors (630313)

Libraries and Procedures

Libraries and Procedures

COE 205. Computer Organization and Assembly Language Dr. Aiman El-Maleh

Real Arithmetic. Fractional binary numbers. Fractional binary numbers examples. Binary real numbers

In order to run the program, go to the folder Release and run project.exe.

Build a program in Release mode and an executable file project.exe is created in Release folder. Run it.

Lab 6: Conditional Processing

Islamic University Gaza Engineering Faculty Department of Computer Engineering ECOM 2125: Assembly Language LAB. Lab # 10. Advanced Procedures

Islamic University Gaza Engineering Faculty Department of Computer Engineering ECOM 2125: Assembly Language LAB. Lab # 8. Conditional Processing

Assembly Language for Intel-Based Computers, 4 th Edition

Marking Scheme. Examination Paper Department of CE. Module: Microprocessors (630313)

Lab 2: Introduction to Assembly Language Programming

Assembly Language Programming

Islamic University Gaza Engineering Faculty Department of Computer Engineering ECOM 2125: Assembly Language LAB. Lab # 7. Procedures and the Stack

COMPUTER ENGINEERING DEPARTMENT

Assembly Language for Intel-Based Computers, 5 th Edition. Chapter 9: Strings and Arrays

Macros. Introducing Macros Defining Macros Invoking Macros Macro Examples Nested Macros Example Program: Wrappers

Chapter 3: Assembly Language Fundamentals. Cristina G. Rivera

Lab 3: Defining Data and Symbolic Constants

Assembly Language for Intel-Based Computers, 4 th Edition. Chapter 3: Assembly Language Fundamentals

Assembly Language for Intel-Based Computers, 5 th Edition. Kip Irvine. Chapter 3: Assembly Language Fundamentals

Lecture 15 Intel Manual, Vol. 1, Chapter 3. Fri, Mar 6, Hampden-Sydney College. The x86 Architecture. Robb T. Koether. Overview of the x86

Chapter 3: Addressing Modes

Assembly Language for Intel-Based Computers, 5 th Edition. Chapter 3: Assembly Language Fundamentals

Microprocessors ( ) Fall 2010/2011 Lecture Notes # 15. Stack Operations. 10 top

Chapter Overview. Assembly Language for Intel-Based Computers, 4 th Edition. Chapter 3: Assembly Language Fundamentals.

The x86 Architecture

We can study computer architectures by starting with the basic building blocks. Adders, decoders, multiplexors, flip-flops, registers,...

EECE.3170: Microprocessor Systems Design I Summer 2017 Homework 4 Solution

Assembly Language for Intel-Based Computers, 5 th Edition

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

Assembly Fundamentals

Computer Architecture and Assembly Language. Practical Session 5

Module 3 Instruction Set Architecture (ISA)

EECE416 :Microcomputer Fundamentals and Design. X86 Assembly Programming Part 1. Dr. Charles Kim

Practical Malware Analysis

Marking Scheme. Examination Paper. Module: Microprocessors (630313)

MATH CO-PROCESSOR Rajiv R Bhandari

The Instruction Set. Chapter 5

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

Assembly Language for Intel-Based Computers, 4 th Edition. Lecture 25: Interface With High-Level Language

Computer Science Final Examination Wednesday December 13 th 2006

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

Assembly Language Lab # 9

Floating Point Instructions

Faculty of Engineering Student Number:

Marking Scheme. Examination Paper. Module: Microprocessors (630313)

Assembly Language Programming: Procedures. EECE416 uc. Charles Kim Howard University. Fall

Low Level Programming Lecture 2. International Faculty of Engineerig, Technical University of Łódź

Memory Models. Registers

CSC 2400: Computer Systems. Towards the Hardware: Machine-Level Representation of Programs

Inline Assembler. Willi-Hans Steeb and Yorick Hardy. International School for Scientific Computing

Computer Architecture and Assembly Language. Practical Session 3

Experiment 8 8 Subroutine Handling Instructions and Macros

Assembly Language. Lecture 2 - x86 Processor Architecture. Ahmed Sallam

Assembly Language Fundamentals

Hardware and Software Architecture. Chapter 2

Stack -- Memory which holds register contents. Will keep the EIP of the next address after the call

EEM336 Microprocessors I. Addressing Modes

16.317: Microprocessor Systems Design I Fall 2014

Figure 8-1. x87 FPU Execution Environment

Constants and Expressions. Lecture 7: Assembly Language Programs. Constants and Expressions (cont.) Statements. Names. Assembly Directives

Instruction Set extensions to X86. Floating Point SIMD instructions

COMPUTER ENGINEERING DEPARTMENT

CSC 8400: Computer Systems. Machine-Level Representation of Programs

Assembly Language for Intel-Based Computers, 4 th Edition. Chapter 2: IA-32 Processor Architecture Included elements of the IA-64 bit

Lab 3. The Art of Assembly Language (II)

Summary: Direct Code Generation

Assembly Language. Lecture 2 x86 Processor Architecture

HUDSON VALLEY COMMUNITY COLLEGE TROY, NEW YORK COURSE OUTLINE

Language of x86 processor family

Program Exploitation Intro

SOEN228, Winter Revision 1.2 Date: October 25,

Digital Forensics Lecture 3 - Reverse Engineering

Dr. Ramesh K. Karne Department of Computer and Information Sciences, Towson University, Towson, MD /12/2014 Slide 1

Assembly Language for Intel-Based Computers, 4 th Edition. Kip R. Irvine. Chapter 2: IA-32 Processor Architecture

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

Lab 4: Basic Instructions and Addressing Modes

UMBC. A register, an immediate or a memory address holding the values on. Stores a symbolic name for the memory location that it represents.

Basic Execution Environment

X86 Addressing Modes Chapter 3" Review: Instructions to Recognize"

Introduction to Assembly Language

Constants and. Lecture 7: Assembly Language Programs. Expressions (cont.) Constants and. Statements. Expressions

Low-Level Essentials for Understanding Security Problems Aurélien Francillon

Faculty of Engineering Computer Engineering Department Islamic University of Gaza Assembly Language Lab # 2 Assembly Language Fundamentals

UNIVERZITET U BEOGRADU ELEKTROTEHNIČKI FAKULTET

16.317: Microprocessor Systems Design I Fall 2015

History of the Intel 80x86

CS401 - Computer Architecture and Assembly Language Programming Glossary By

Name: CMSC 313 Fall 2001 Computer Organization & Assembly Language Programming Exam 1. Question Points I. /34 II. /30 III.

CS 31: Intro to Systems ISAs and Assembly. Martin Gagné Swarthmore College February 7, 2017

Transcription:

: Programming with Contemporary Instruction Set Duration: 3 hours Components: Lab exercises and report. Objectives: (a) To examine how protected-mode programming is done on x86 based computer. (b) To evaluate the advantages of protected-mode programming compared to real-mode programming in x86 microprocessor. (c) To develop protected-mode assembly language programs which utilize the floatingpoint unit (FPU) on x86 based computer. (d) To develop Win32 Console programs based on x86 assembly language. 1. Floating-Point Unit The Intel 8086 processor was designed to handle only integer arithmetic. This turned out to be a problem for graphics and calculation-intensive software using floating-point calculations. It was possible to emulate floating-point arithmetic purely through software, but the performance penalty was severe. Programs such as AutoCad (by Autodesk) demanded a more powerful way to perform floating-point math. Intel sold a separate floating-point coprocessor chip named the 8087, and upgraded it along with each processor generation. Beginning from Intel 80486, the floating-point hardware was integrated into the processor and known as the floating-point unit (FPU). 1.1 FPU Register Stack The FPU does not use the general-purpose registers (EAX, EBX, etc.). Instead, it has its own set of registers called a register stack. It loads values from memory into the register stack, performs calculations, and stores stack values into memory. FPU instructions evaluate mathematical expressions in postfix format. The following, for example, is called an infix expression: (5 * 6) + 4. The postfix equivalent is 5 6 * 4 + The infix expression (A + B) * C requires parenthesis to override the default precedence rules (multiplication before addition). The parenthesis is not required in the equivalent postfix expression: A B + C * 1.1.1 Expression Stack A stack holds intermediate values during the evaluation of postfix expressions. Figure 1.1 shows the steps required to evaluate the postfix expression 5 6 * 4. The stack entries are labelled ST(0) and ST(1), with ST(0) indicating where the stack pointer would normally be pointing. Page 1 of 11

Figure 1.1: Evaluating the Postfix Expression 5 6 * 4. Table 1.1 contains some examples of translating infix to equivalent postfix expressions. Table 1.1 Infix to Postfix Examples Infix Postfix A + B A B + (A - B) / D A B - D / (A + B) * (C + D) A B + C D + * ((A + B) / C) * (E - F) AB + C / EF - * 1.2 FPU Data Registers The FPU has eight individually addressable 80-bit data registers named R0 through R7 (see Figure 2). Together, they are called a register stack. A three-bit field named TOP in the FPU status word identifies the register number that is currently the top of the stack. In Figure 1.2, for example, TOP equals binary 011, identifying R3 as the top of the stack. This stack location is also known as ST(0) (or simply ST) when writing floating-point instructions. The last register is ST(7). Figure 1.2: Floating-Point Data Register Stack. As we might expect, a push operation (also called load) decrements TOP by 1 and copies an operand into the register identified as ST(0). If TOP equals 0 before a push, TOP wraps around to register R7. A pop operation (also called store) copies the data at ST(0) into an operand, then adds 1 to TOP. If TOP equals 7 before the pop, it wraps around to register R0. Page 2 of 11

If loading a value into the stack would result in overwriting existing data in the register stack, a floating-point exception is generated. Figure 1.3 shows the same stack after 1.0 and 2.0 have been pushed (loaded) on the stack. Figure 1.3: FPU Stack after Pushing 1.0 and 2.0. Although it is interesting to understand how the FPU implements the stack using a limited set of registers, we need only focus on the ST(n) notation, where ST(0) is always the top of stack. From this point forward, we refer to stack registers as ST(0), ST(1), and so on. Instruction operands cannot refer directly to register numbers. Floating-point values in registers use the IEEE 10-byte extended real format (also known as temporary real). When the FPU stores the result of an arithmetic operation in memory, it translates the result into one of the following formats: integer, long integer, single precision (short real), double precision (long real), or packed binary-coded decimal (BCD). 1.3 Floating-Point Instruction Set The FPU instruction set is somewhat complex, so we will attempt here to give you an overview of its capabilities, along with specific examples that demonstrate code typically generated by compilers. In addition, we will see how you can exercise control over the FPU by changing its rounding mode. The instruction set contains the following basic categories of instructions: Data transfer Basic arithmetic Comparison Transcendental Load constants (specialized predefined constants only) x87 FPU control x87 FPU and SIMD state management Floating-point instruction names begin with the letter F to distinguish them from CPU instructions. The second letter of the instruction mnemonic (often B or I) indicates how a memory operand is to be interpreted: B indicates a BCD operand, and I indicates a binary integer operand. If neither is specified, the memory operand is assumed to be in real-number format. For example, FBLD operates on BCD numbers, FILD operates on integers, and FLD operates on real numbers. Page 3 of 11

1.3.1 Operands A floating-point instruction can have zero operands, one operand, or two operands. If there are two operands, one must be a floating-point register. There are no immediate operands, but certain predefined constants (such as 0.0, _ and log2 10) can be loaded into the stack. General-purpose registers such as EAX, EBX, ECX, and EDX cannot be operands. (The only exception is FSTSW, which stores the FPU status word in AX.) Memory-to-memory operations are not permitted. Integer operands must be loaded into the FPU from memory (never from CPU registers); they are automatically converted to floating-point format. Similarly, when storing floating-point values into integer memory operands, the values are automatically truncated or rounded into integers. 1.3.2 Initialization (FINIT) The FINIT instruction initializes the FPU. It sets the FPU control word to 037Fh, which masks (hides) all floating-point exceptions, sets rounding to nearest even, and sets the calculation precision to 64 bits. We recommend calling FINIT at the beginning of your programs, so you know the starting state of the processor. 1.3.3 Floating-Point Data Types Let s quickly review the floating-point data types supported by MASM (QWORD, TBYTE, REAL4, REAL8, and REAL10), listed in Table 1.2. You will need to use these types when defining memory operands for FPU instructions. For example, when loading a floating-point variable into the FPU stack, the variable is defined as REAL4, REAL8, or REAL10: bigval REAL10 1.212342342234234243E+864 fld bigval ; load variable into stack Table 1.2: Intrinsic Data Types. Type Usage QWORD 64-bit integer TBYTE 80-bit (10-byte) integer REAL4 32-bit (4-byte) IEEE short real REAL8 64-bit (8-byte) IEEE long real REAL10 80-bit (10-byte) IEEE extended real 1.3.4 Reading and Writing Floating-Point Values In this experiment, the following two procedures for floating-point input-output (created by William Barrett of San Jose State University) are used: ReadFloat: Reads a floating-point value from the keyboard and pushes it on the floatingpoint stack. It accepts a wide variety of floating-point formats. Some examples are shown below: 35 3.5E005 +35. -3.5E+5-3.5 3.5E-4.35 +3.5E-4 3.5E5 WriteFloat: Writes the floating-point value at ST(0) to the console window in exponential format. ShowFPUStack: Another useful procedure, written by James Brink of Pacific Lutheran University, displays the FPU stack. It is called with no parameters: call ShowFPUStack Page 4 of 11

Example 1.1 The following example program pushes two floating-point values on the FPU stack, displays it, inputs two values from the user, multiplies them, and displays their product: TITLE Example 1.1 (ex11.asm) INCLUDE Irvine32.inc INCLUDE macros.inc first REAL8 123.456 second REAL8 10.0 third REAL8? main PROC finit ; initialize FPU ; Push two floats and display the FPU stack. fld first fld second call ShowFPUStack ; Input two floats and display their product. mwrite "Please enter a real number: " call ReadFloat mwrite "Please enter a real number: " call ReadFloat fmul ST(0),ST(1) ; multiply mwrite "Their product is: " call WriteFloat call Crlf exit main ENDP END main Note: Please refer to Appendix A on how to build and run this program. Sample input/output (user input shown in bold type): ------ FPU Stack ------ ST(0): +1.0000000E+001 ST(1): +1.2345600E+002 Please enter a real number: 3.5 Please enter a real number: 4.2 Their product is: +1.4700000E+001 Example 1.2 Let s code the expression vald = -vala + (valb * valc). A possible step-by-step solution is: Load vala on the stack and negate it. Load valb into ST(0), moving vala down to ST(1). Multiply ST(0) by valc, leaving the product in ST(0). Add ST(1) and ST(0) and store the sum in vald: TITLE Example 1.2 (ex12.asm) INCLUDE Irvine32.inc INCLUDE macros.inc vala REAL8 1.5 valb REAL8 2.5 valc REAL8 3.0 vald REAL8? ; +6.0 Page 5 of 11

main PROC finit fld vala ; ST(0) = vala fchs ; change sign of ST(0) fld valb ; load valb into ST(0) fmul valc ; ST(0) *= valc fadd ; ST(0) += ST(1) fstp vald ; store ST(0) to vald exit main ENDP END main Please refer to Appendix B on how to debug this program. Exercise 1 Write a program that prompts the user for the radius of a circle. Calculate and display the circle s circumference / area. Use the ReadFloat and WriteFloat procedures. Use the FLDPI instruction to load onto the register stack. Please refer to Appendix A on how to create, build and run your program. 2. Win32 Console Programming On the surface, 32-bit console mode programs look and behave like 16-bit MS-DOS programs running in text mode. There are differences, however: The former runs in 32-bit protected mode, whereas MS-DOS programs run in real-address mode. They use different function libraries. Win32 programs call functions from the same library used by graphical Windows applications. MS-DOS programs use BIOS and MS-DOS interrupts that have existed since the introduction of the IBM-PC. 2.1 Application Programming Interface An Application Programming Interface (API) is a collection of types, constants, and functions that provide a way to directly manipulate objects through programming. Therefore, the Win32 API lets you tap into the functions in the 32-bit version of MS-Windows. The Irvine32 link library used in this experiment is completely built on Win32 console functions. It is compatible with Win32 API functions and can be used for basic input output, simulations, timing, and other useful operations. Table 2.1 gives a complete list of procedures in the Irvine32 link library. Table 2.1: Procedures in the Irvine32 link library Procedure Description CloseFile Closes a disk file that was previously opened. Clrscr Clears the console window and locates the cursor at the upper left corner. CreateOutputFile Creates a new disk file for writing in output mode. Crlf Writes an end-of-line sequence to the console window. Delay Pauses the program execution for a specified n -millisecond interval. DumpMem Writes a block of memory to the console window in hexadecimal. DumpRegs Displays the EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EFLAGS, and EIP registers in hexadecimal. Also displays the most common CPU status flags. GetCommandTail Copies the program s command-line arguments (called the command tail) into an array of bytes. GetDateTime Gets the current date and time from the system. GetMaxXY Gets the number of columns and rows in the console window s buffer. GetMseconds Returns the number of milliseconds elapsed since midnight. GetTextColor Returns the active foreground and background text colors in the console Page 6 of 11

Gotoxy IsDigit MsgBox MsgBoxAsk OpenInputFile ParseDecimal32 ParseInteger32 Random32 Randomize RandomRange ReadChar ReadDec ReadFromFile ReadHex ReadInt ReadKey ReadString SetTextColor Str_compare Str_copy Str_length Str_trim Str_ucase WaitMsg WriteBin WriteBinB WriteChar WriteDec WriteHex WriteHexB WriteInt WriteStackFrame WriteStackFrameName WriteString WriteToFile WriteWindowsMsg window. Locates the cursor at a specific row and column in the console window. Sets the Zero flag if the AL register contains the ASCII code for a decimal digit (0 9). Displays a popup message box. Display a yes/no question in a popup message box. Opens an existing disk file for input. Converts an unsigned decimal integer string to 32-bit binary. Converts a signed decimal integer string to 32-bit binary. Generates a 32-bit pseudorandom integer in the range 0 to FFFFFFFFh. Seeds the random number generator with a unique value. Generates a pseudorandom integer within a specified range. Waits for a single character to be typed at the keyboard and returns the character. Reads an unsigned 32-bit decimal integer from the keyboard, terminated by the Enter key. Reads an input disk file into a buffer. Reads a 32-bit hexadecimal integer from the keyboard, terminated by the Enter key. Reads a 32-bit signed decimal integer from the keyboard, terminated by the Enter key. Reads a character from the keyboard s input buffer without waiting for input. Reads a string from the keyboard, terminated by the Enter key. Sets the foreground and background colors of all subsequent text output to the console. Compares two strings. Copies a source string to a destination string. Returns the length of a string in EAX. Removes unwanted characters from a string. Converts a string to uppercase letters. Displays a message and waits for a key to be pressed. Writes an unsigned 32-bit integer to the console window in ASCII binary format. Writes a binary integer to the console window in byte, word, or doubleword format. Writes a single character to the console window. Writes an unsigned 32-bit integer to the console window in decimal format. Writes a 32-bit integer to the console window in hexadecimal format. Writes a byte, word, or doubleword integer to the console window in hexadecimal format Writes a signed 32-bit integer to the console window in decimal format. Writes the current procedure s stack frame to the console. Writes the current procedure s name and stack frame to the console. Writes a null-terminated string to the console window. Writes a buffer to an output file. Displays a string containing the most recent error generated by MS- Windows. Some of the procedures that are used in this experiment are described in the following sections. Page 7 of 11

2.1.1 MsgBox The MsgBox procedure displays a graphical popup message box with an optional caption. (This works when the program is running in a console window.) Pass it the offset of a string in EDX, which will appear in the inside the box. Optionally, pass the offset of a string for the box s title in EBX. To leave the title blank, set EBX to zero. Sample call: caption db "Dialog Title", 0 HelloMsg mov ebx,offset caption mov edx,offset HelloMsg call MsgBox Sample output: BYTE "This is a pop-up message box.", 0dh,0ah BYTE "Click OK to continue...", 0 2.1.2 MsgBoxAsk The MsgBoxAsk procedure displays a graphical popup message box with Yes and No buttons. (This works when the program is running in a console window.) Pass it the offset of a question string in EDX, which will appear in the inside the box. Optionally, pass the offset of a string for the box s title in EBX. To leave the title blank, set EBX to zero. MsgBoxAsk returns an integer in EAX that tells you which button was selected by the user. The value will be one of two predefined Windows constants: IDYES (equal to 6) or IDNO (equal to 7). Sample call: caption BYTE "Survey Completed",0 question BYTE "Thank you for completing the survey." BYTE 0dh,0ah BYTE "Would you like to receive the results?",0 mov ebx,offset caption mov edx,offset question call MsgBoxAsk ;(check return value in EAX) Sample output: Page 8 of 11

2.1.3 ReadString The ReadString procedure reads a string from the keyboard, stopping when the user presses the Enter key. Pass the offset of a buffer in EDX and set ECX to the maximum number of characters the user can enter, plus 1 (to save space for the terminating null byte). The procedure returns the count of the number of characters typed by the user in EAX. Sample call: buffer BYTE 21 DUP(0) ; input buffer bytecount DWORD? ; holds counter mov edx,offset buffer ; point to the buffer mov ecx,sizeof buffer ; specify max characters call ReadString ; input the string mov bytecount,eax ; number of characters ReadString automatically inserts a null terminator in memory at the end of the string. The following is a hexadecimal and ASCII dump of the first 8 bytes of buffer after the user has entered the string ABCDEFG : 41 42 43 44 45 46 47 00 ABCDEFG The variable bytecount equals 7. 2.1.4 WriteString The WriteString procedure writes a null-terminated string to the console window. Pass the string s offset in EDX. Sample call: prompt BYTE "Enter your name: ",0 mov edx,offset prompt call WriteString 2.1.5 WriteDec The WriteDec procedure writes a 32-bit unsigned integer to the console window in decimal format with no leading zeros. Pass the integer in EAX. Sample call: mov eax,295 call WriteDec ; displays: "295" 2.1.6 WriteToFile The WriteToFile procedure writes the contents of a buffer to an output file. Pass it a valid file handle in EAX, the offset of the buffer in EDX, and the number of bytes to write in ECX. When the procedure returns, if EAX is greater than zero, it contains a count of the number of bytes written; otherwise, an error occurred. The following code calls WriteToFile: BUFFER_SIZE = 5000 filehandle DWORD? buffer BYTE BUFFER_SIZE DUP(?) mov eax,filehandle mov edx,offset buffer mov ecx,buffer_size call WriteToFile Page 9 of 11

The following pseudocode describes how to handle the value returned in EAX after calling WriteToFile: if EAX = 0 then error occurred when writing to file call WriteWindowsMessage to see the error else EAX = number of bytes written to the file endif Example 2 The following program creates a file in output mode, asks the user to enter some text, writes the text to the output file, reports the number of bytes written, and closes the file. It checks for errors after attempting to create the file: TITLE Creating a File (CreateFile.asm) INCLUDE Irvine32.inc BUFFER_SIZE = 501 buffer BYTE BUFFER_SIZE DUP(?) filename BYTE "output.txt",0 filehandle HANDLE? stringlength DWORD? byteswritten DWORD? str1 BYTE "Cannot create file",0dh,0ah,0 str2 BYTE "Bytes written to file [output.txt]:",0 str3 BYTE "Enter up to 500 characters and press" BYTE "[Enter]: ",0dh,0ah,0 main PROC ; Create a new text file. mov edx,offset filename call CreateOutputFile mov filehandle,eax ; Check for errors. cmp eax, INVALID_HANDLE_VALUE ; error found? jne file_ok ; no: skip mov edx,offset str1 ; display error call WriteString jmp quit ; Ask the user to input a string. file_ok: mov edx,offset str3 ; "Enter up to..." call WriteString mov ecx,buffer_size ; Input a string mov edx,offset buffer call ReadString mov stringlength,eax ; counts chars entered ; Write the buffer to the output file. mov eax,filehandle mov edx,offset buffer Page 10 of 11

mov ecx,stringlength call WriteToFile mov byteswritten,eax ; save return value call CloseFile ; Display the return value. mov edx,offset str2 ; "Bytes written" call WriteString mov eax,byteswritten call WriteDec call Crlf quit: exit main ENDP END main Note: Please refer to Appendix A on how to create, build and run this program Exercise 2 Modify the program in Example 2 so that it will display a graphical popup message box to ask the user whether the text file should be created. If the user selects Yes, the text file is created and the program terminates. Otherwise, the program will terminate directly. References 1. Kip R. Irvine, Assembly Language for x86 Processors, 6 th Edition, Prentice-Hall Inc., U.S.A., 2010. 2. Kip R. Irvine, Assembly Language for x86 Processors, 6 th Edition [Online]. Available: http://kipirvine.com/asm/ Important Note: Lab assessment will be carried out during the lab session. It is the student's responsibility to complete the given tasks and report to the lab instructors for assessment. (END) Page 11 of 11