Assembly language programming• Learning assembly language programming will help understanding the operations of the microprocessor • To learn: – Need to know the functions of various r
Trang 18086 Assembly Language
Programming
Week 4 – Overview of the x86 assembly language prgoramming
Trang 2Assembly language programming
• Learning assembly language programming will
help understanding the operations of the
microprocessor
• To learn:
– Need to know the functions of various registers
– Need to know how external memory is organized and how it is addressed to obtain instructions and data
(different addressing modes)
– Need to know what operations (or the instruction set)
are supported by the CPU For example, powerful CPUs support floating-point operations but simple CPUs only support integer operations
Trang 3How to learn programming
• Logic thinking – programming is problem solving
so we must think logically in order to derive a
solution
• Practice – write programs
Trang 4Assembly Program
• The native language is machine language (using
0,1 to represent the operation)
• A single machine instruction can take up one or
more bytes of code
• Assembly language is used to write the program
using alphanumeric symbols (or mnemonic), eg
ADD, MOV, PUSH etc.
• The program will then be assembled (similar to
compiled) and linked into an executable program
• The executable program could be com, exe, or
.bin files
Trang 5Flow of program development
Program
.asm Object file.obj Executable file .exe
Trang 6• When the program is executed, then the value
B400 is read from memory, decoded and carry out the task
Trang 7Assembly Program
• Each instruction is represented by one assembly
language statement
• The statement must specify which operation (opcode)
is to be performed and the operands
• Eg ADD AX, BX
• ADD is the operation
• AX is called the destination operand
• BX is called the source operand
• The result is AX = AX + BX
• When writing assembly language program, you need
to think in the instruction level
Trang 8• In c++, you can do A = (B+C)*100
• In assembly language, only one instruction per
statement
A = B ; only one instruction - MOVE
A = A+C ; only one instruction - ADD
A = A*100 ; only one instruction - Multiply
Trang 9Format of Assembly language
• General format for an assembly language statement
• Start: Mov AX, BX ; copy BX into AX
Start is a user defined name and you only put in a
label in your statement when necessary!!!!
The symbol : is used to indicate that it is a label
Trang 108086 Software Model
Trang 11Software model
stack, data, and extra
• When you write your assembly language program for an
8086, theoretically you should define the different
segments!!!
register: CS (code), SS (stack), DS (data), ES (extra)
make use of the proper segment register or index register when you want to access the memory
Trang 12• In assembly programming, you cannot operate on two memory locations in the same instruction
• So you usually need to store (move) value of one
location into a register and then perform your
operation
• After the operation, you then put the result back
to the memory location
• Therefore, one form of operation that you will use very frequent is the store (move) operation!!!
• And using registers!!!!!
Trang 13• In C++ A = B+C ; A, B, C are variables
• In assembly language A,B, C representing memory locations so you cannot do A = B+C
– MOV AL, B ; move value of B into AL register
– ADD, AL, C ; do the add AL = AL +C
– MOV A, AL ; put the result to A
Trang 14Data registers
registers but each of the registers also has special function Example
– AX is called the accumulator – to store result in arithmetic
operations
destination of an operand during an arithmetic, logic,
shift, or rotate operation
assumed, eg in I/O mapped input and output operations
Trang 15Data register
• In based addressing mode, base register BX is
used as a pointer to an operand in the current
data segment
• CX is used as a counter in some instructions, eg CL contains the count of the number of bits by which the contents of the operand must be rotated or
shifted by multiple-bit rotate
• DX, data register, is used in all multiplication and
division, it also contains an input/output port
address for some types of input/output operations
Trang 16Pointer and index registers
• Stack – is used as a temporary storage
• Data can be stored by the PUSH instruction and
extracted by the POP instruction
• Stack is accessed via the SP (Stack Pointer) and BP
(Base Pointer)
• The BP contains an offset address in the current
stack segment This offset address is employed when using the based addressing mode and is commonly
used by instructions in a subroutine that reference
parameters that were passed by using the stack
Trang 17Pointer and Index Register
• Source index register (SI) and Destination index
register (DI) are used to hold offset addresses for use in indexed addressing of operands in memory
• When indexed type of addressing is used, then SI
refers to the current data segment and DI refers to the current extra segment
• The index registers can also be used as source or
destination registers in arithmetic and logical
Trang 18as the sign-bit (0 for positive, 1 for negative)
128-bit data
• In 8086, only integer operations are supported!!!
Trang 19A sample program
.code ; indicate start of code segment
.startup ; indicate start of program
Trang 20Assembly programming
In general, an assembly program must include the code segment!!
Other segments, such as stack segment, data segment are not
compulsory
There are key words to indicate the beginning of a segment as
well as the end of a segment Just like using main(){} in C++
Programming
Example
DSEG segment ‘data’ ; define the start of a data segment
DSEG ENDS ; defines the end of a data segment
Segment is the keyword DSEG is the name of the segment
Similarly key words are used to define the beginning of a program,
as well as the end.
Trang 21Assembly language programming
Example
CSEG segment ‘code’
START PROC FAR ; define the start of a program (procedure)
START ENDP ; define the end of a procedure
CSEG ends
End start ; end of everything
Different assembler may have different syntax for the definition
of the key words !!!!!
Start is just a name it could be my_prog, ABC etc
Trang 22More sample
Stacksg segment para ‘stack’
… ; define the stack segment
Stacksg ends
Datasg segment para
…… ; declare data inside the data segment
Datasg ends
Codesg segment para ‘code’
Main proc far ;
assume ss:stacksg, ds: datasg, cs:codesg mov ax, datasg
mov ds, ax
….
mov ax, 4c00H int 21H
Main endp
Codesg ends
end main
Trang 23To declare a segment, the syntax is:
segment_name SEGMENT alignment class
Example Stacksg segment PARA (this statement is used in previous slide)
PARA – define the alignment of the segment base address, the segment with a starting addressing that is evenly Divisible by 16 But the default value is also base address divisible
by 16 so the key word PARA can be ignored!
Trang 24• ‘data’, ‘code’ – class entry Is used to group related segments when linking The linker automatically
groups segments of the same class in memory
• PROC – define procedures (similar to a function)
inside the code segment Each procedure must be identified by an unique name At the end of the
procedure, you must include the ENDP
Trang 25FAR – is related to program execution When you request execution
of a program, the program loader uses this procedure as the entry
point for the first instruction to execute
Assume – to associate, or to assign, the name of a segment with a segment register
In some assembler, you need to move the base address of a segment directly into the
segment register!!!
END – ends the entire program and appears as the last statement Usually the name of the first or only PROC designated as FAR is put after END
Trang 26Syntax of a simple assembly
Trang 27mov DL, 0H ; move 0H to DL
mov CL, op1 ; move op1 to CL
mov AL, data ; move data to AL
step:
cmp AL, op1 ; compare AL and op1
jc label1 ; if carry =1 jump to label1
sub AL, op1 ; AL = AL –op1
Trang 28Assembler for 8086
Emu8086 (http:// www.emu8086.com) – there is a trial version but
it does not support all the features such as interrupt
The emu8086 consists of a tutorial and the reference for a
complete instruction set
Keil – www.keil.com
Trang 29Defining data in a program
Data is usually stored in the data segment
You can define constants, work areas (a chunk of memory )
Data can be defined in different length (8-bit, 16-bit)
8-bit then use DB 16-bit then use DW
The definition for data:
[name] Dn expression ; Dn is either DB or DW
Name – a program that references a data item by means of a name
The name of an item is otherwise optional
Dn – this is called the directives It defines length of the data
Expression – define the values (content) for the data
Trang 30Examples for data
FLDA DB ? ; define an uninitialized item called FLDA 8-bit
FLDB DB 25 ; initialize a data to 25
Define multiple data under the same name (like an array)
FLDC DB 21, 22, 23, 34 ; the data are stored in adjacent bytes
FLDC stores the first value
FLDC + 1 stores the second value
You can do mov AL, FLDC+3
Trang 31Example for data definition
DUP – duplicate
DUP can be used to define multiple storages
DB 10 DUP (?) ; defines 10 bytes not initialize
DB 5 DUP (12) ; 5 data all initialized to 12
String :
DB ‘this is a test’
EQU – this directive does not define a data item; instead, it defines
a value that the assembler can use to substitute in other instructions
(similar to defining a constant in C programming or using the #define )
factor EQU 12
mov CX, factor
Trang 32Assembly Program
• Assembly language should be more effective and
it will take up less memory space and run faster
• In real-time application, the use of assembly
program is required because program that is
written in a high-level language probably could
not respond quickly enough
• You can also put assembly codes into your C++
program in order to reduce the execution time!!!!
Trang 33Assembly language programming
• The syntax for different microprocessor may be
different but the concept is the same so once you
learn the assembly programming for one
microprocessor, you can easily program other kinds
of system
• For example, programming the 8051 series is very
similar to the 8086
Trang 34Addressing Modes
• Function of the addressing modes is to access the
operands
• Available modes (9 modes): register addressing,
immediate addressing, direct addressing, register indirect addressing, based addressing, indexed
addressing, based indexed addressing, string
addressing, and port addressing
• Addressing modes provide different ways of
computing the address of an operand
Trang 35Why addressing mode is important?
• In c++, you can define an array, or a variable
How this can be done using assembly language
programming? This is via different addressing
modes!!!!
Trang 36Register addressing mode
• The operand to be accessed is specified as residing
in an internal register of the 8086
• Eg MOV AX, BX
• Move (MOV) contents of BX (the source operand),
to AX (the destination operand)
• Both operands are in the internal registers
Trang 39Immediate addressing modeSource operand is part of the instruction
Usually immediate operands represent constant data
The operands can be either a byte or word
e.g MOV AL, 15
15 is a byte wide immediate source operand
Or it could be MOV AL, #15
The immediate operand is stored in program storage memory (i.e the code segment)
This value is also fetched into the instruction queue
in the BIU
Trang 42Direct addressing mode
• Move a byte or word between a memory location
and a register
• the locations following the instruction opcode hold
an effective memory address (EA) instead of data
• The address is a 16-bit offset of the storage
location of the operand from the current value in
the data segment register
• Physcial address = DS + offset
• The instruction set does not support a
memory-to-memory transfer!
Trang 43Direct addressing
• Data is assumed to be stored in the data segment
so DS is used in calculating the physical address!!!
• External memory bus cycle is needed to do the
read
• Example of direct addressing: mov AL, var1
• Where Var1 can be regarded as a variable
Trang 44Register indirect addressing mode
location addressed by an index or base register
– Example MOV AL, [SI]
– SI – index register
– The symbol [] always refer to an indirect addressing
• The effective address (EA) is stored either in a pointer
register or an index register
pointer register BP
• The index register can be source index register SI, or
destination index register DI
Trang 45Register indirect addressing
• Value stored in the SI register is used as the offset address
memory location : DS + SI to the AX register
address) is a variable and depends on the index, or base
register value
Trang 46If CL = 88 and BX = 1233H and DS =0H Physical address = DS + BX = 01233H