350 likes | 480 Views
Outline. Learning Assembly by an Example. Program Formats Some Simple Instructions Assemble and Execute Learning Another Example Data Definition Constants Memory Register. Example: Adding 3 Integers. TITLE Add and Subtract (AddSub.asm)
E N D
Outline • Learning Assembly by an Example. • Program Formats • Some Simple Instructions • Assemble and Execute • Learning Another Example • Data Definition • Constants • Memory • Register
Example: Adding 3 Integers TITLE Add and Subtract (AddSub.asm) ; This program adds and subtracts 32-bit integers. INCLUDE Irvine32.inc .code main PROC mov eax,10000h ; EAX = 10000h add eax,40000h ; EAX = 50000h sub eax,20000h ; EAX = 30000h call DumpRegs ; display registers exit main ENDP END main
Program Description • Directives vs. Instructions. • Use Directives to tell assembler what to do. • Use Instructions to tell CPU what to do. • Procedure defined by: • [Name] PROC • [Name] ENDP • Instruction Format: • LABEL (optional), Mnemonic, Operands
Directives • Commands that are recognized and acted upon by the assembler • Not part of the Intel instruction set • Used to declare code, data areas, select memory model, declare procedures, etc.
Instructions • Assembled into machine code by assembler • Executed at runtime by the CPU • Member of the Intel IA-32 instruction set • Parts • Label • Mnemonic • Operand
I/O • Not as easy as you think, if you program it yourself. • We will use the library provided by the author of the textbook. • Two steps: • Include the library (Irvine32.inc) in your code. • Call the subroutines.
Assemble and Run! • The required software comes with the book: • MASM: Microsoft Macro Assembler • Visual Studio: A Debugger • Irvine32.inc: I/O procedures
Assemble-Link Execute Cycle • The following diagram describes the steps from creating a source program through executing the compiled program. • If the source code is modified, Steps 2 through 4 must be repeated.
Steps to Run AddSub.asm C:\MASM>ML -Zi -c -Fl -coff addsub.asm //generate AddSub.obj and AddSub.lst C:\MASM>LINK32 addsub.obj irvine32.lib kernel32.lib /SUBSYSTEM:CONSOLE /DEBUG /MAP //generate Addsub.exe, Addsub.ilk, Addsub.pdb, and Addsub.map C:\MASM>addsub //show the content of registers
Using make32.bat … ML -Zi -c -Fl -coff %1.asm … LINK32 %1.obj irvine32.lib kernel32.lib /SUBSYSTEM:CONSOLE /DEBUG /MAP … dir %1.* … C:\MASM615>make32 c:\MASM\AddSub
Using Visual Studio to Assemble, Run, and Debug AddSub.asm • http://www.nuvisionmiami.com/books/asm/ide/vs6/index.htm • Demo
Another Example TITLE Add and Subtract (AddSub2.asm) INCLUDE Irvine32.inc .data Val1 DWORD 10000h Val2 DWORD 40000h Val3 DWORD 20000h finalVal DWORD ? .code main PROC mov eax,Val1 ; EAX = 10000h add eax,Val2 ; EAX = 50000h sub eax,Val3 ; EAX = 30000h mov finalVal1,eax ; store the result call DumpRegs ; display registers exit main ENDP END main
Data Declaration • [Label], Type, Initialization (or just ?) • Example: Var1 BYTE 7 • Use ? if no initialization necessary. • Example: Var1 BYTE ? • Other data types: (See Table 3-2 in p.81) • WORD (or DW), • DWORD (or DD), …etc.
Signed vs. Unsigned • Signed vs. Unsigned: • SBYTE vs. BYTE • SWORD vs. WORD • …etc. • Example: • Var1 BYTE 255 • Var1 SBYTE -1
Characters and Strings • How about characters? • A few examples: • Var1 BYTE ‘A’ • Var1 BYTE 41h • S1 BYTE ‘Hello, World!’ • Line BYTE ‘--------------------’
How About A List or Array? • Just list them! For example: • List1 BYTE 10, 32, 41h • You may also mix them: • List1 BYTE 10, 32, ?, ‘A’ • List2 BYTE “good”, ‘o’, ‘r’, ‘b’, ‘a’, ‘d’, 0
DUP • Good for allocating space for a string or array. • Examples: • Var1 BYTE 20 DUP (0) • Var2 BYTE 20 DUP (?) • Var3 BYTE 4 DUP (“STACK”)
Another Example INCLUDE Irvine32.inc C1 EQU 40000h .data Val1 DWORD 10000h .code main PROC mov eax,Val1 ; EAX = 10000h add eax,C1 ; EAX = 50000h call DumpRegs ; display registers exit main ENDP END main
EQU is for Constants • EQU for constants. • Also OK to use = for integers. • Examples: • COUNT = 500 • COUNT EQU 500 • Good programming style: COUNT = 500 . . mov al,COUNT
Expression and Text in EQU • OK to use expressions in EQU: • Matrix1 EQU 10 * 10 • Matrix1 EQU <10 * 10> • No expression evaluation if within < >. • EQU accepts texts too: • Msg EQU <“Press any key…”>
Memory • Organized like mailboxes, numbered 0, 1, 2, 3,…, 2n-1. • Each box can hold 8 bits (1 byte) • So it is called byte-addressing. …
Byte? Word? • The number has limited range. • 1 Byte = 8 Bits: • Binary: 0000 0000 to 1111 1111 • Hexadecimal: 00 to FF • Decimal: 0 to 255 • Word = 2 or 4 bytes, depending on the machine. In 80x86, it means 2 bytes.
Number Systems • Binary & hexadecimal numbers. • Conversion between them and decimal. • How to represent negative numbers (in 2’s compliment).
Memory Address • Byte Addressing: each memory location has 8 bits. • If we have only 16 bytes… • 4 bits are enough for an address • What if we have 64K? • 1M? 1G? …
Memory Address • 16-bit address is enough for up to 64K • 20-bit for 1M • 32-bit for 4G
Character String • So how are strings like “Hello, World!” are stored in memory? • ASCII Code! (or Unicode…etc.) • Each character is stored as a byte. • Review: how is “1234” stored in memory?
Integer • A byte can hold an integer number: • between 0 and 255 (unsigned) or • between –128 and 127 (2’s compliment) • How to store a bigger number? • Review: how is 1234 stored in memory?
Big or Little Endian? • Example: 1234 is stored in 2 bytes. • = 100-1101-0010 in binary • = 04 D2 in hexadecimal • Do you store 04 or D2 first? • Big Endian: 04 first. • Little Endian: D2 first. Intel’s choice
Little Endian Order • All data types larger than a byte store their individual bytes in reverse order. The least significant byte occurs at the first (lowest) memory address. • Example: • val1 DWORD 12345678h • Demo
Reason for Little-Endian? • More consistent for variable length (e.g., 2 bytes, 4 bytes, 8 bytes…etc.)
Registers • General-Purpose: • AX, BX, CX, DX: 16 bits • Splitted into H and L parts, 8 bits each. • Extended into E?X to become 32-bit register (i.e., EAX, EBX,…etc.).
Convention • EAX: accumulator • EBX: base register • ECX: count register • EDX: data register
Other Registers We will explain their meaning when we encounter them later this semester: • Segment (CS, DS, SS, ES) • Pointer (EIP, ESP, EBP) • Index (ESI, EDI) • EFLAGS
Homework1 • http://dclab.cs.nthu.edu.tw/~course/Assembly/Project1.doc