CS2422 Lecture Slides - National Tsing Hua University

Download Report

Transcript CS2422 Lecture Slides - National Tsing Hua University

Outline
Learning Assembly by an Example.




Learning Another Example





Program Formats
Some Simple Instructions
Assemble and Execute
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
add eax,40000h
sub eax,20000h
call DumpRegs
exit
main ENDP
END main
;
;
;
;
EAX = 10000h
EAX = 50000h
EAX = 30000h
display registers
Program Description

Directives vs. Instructions.



Procedure defined by:



Use Directives to tell assembler what to do.
Use Instructions to tell CPU what to do.
[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
INCLUDE Irvine32.inc
.data
Val1 DWORD 10000h
Val2 DWORD 40000h
Val3 DWORD 20000h
finalVal DWORD ?
.code
main PROC
mov eax,Val1
add eax,Val2
sub eax,Val3
mov finalVal1,eax
call DumpRegs
exit
main ENDP
END main
(AddSub2.asm)
;
;
;
;
;
EAX = 10000h
EAX = 50000h
EAX = 30000h
store the result
display registers
Data Declaration

[Label], Type, Initialization (or just ?)


Use ? if no initialization necessary.


Example: Var1 BYTE 7
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
Var2 BYTE
Var3 BYTE
20 DUP (0)
20 DUP (?)
4 DUP (“STACK”)
Another Example
INCLUDE Irvine32.inc
C1 EQU 40000h
.data
Val1 DWORD 10000h
.code
main PROC
mov eax,Val1
add eax,C1
call DumpRegs
exit
main ENDP
END main
; EAX = 10000h
; EAX = 50000h
; display registers
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
32-bit General-Purpose Registers
EAX
EBP
EBX
ESP
ECX
ESI
EDX
EDI
16-bit Segment Registers
EFLAGS
EIP
CS
ES
SS
FS
DS
GS
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