Download Chapter 4

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Chapter 4: Using the Assembler
Slides to Accompany
Assembly Language for Intel-Based Computers,
Third Edition
Irvine, Kip R. Assembly Language For Intel-Based Computers
Overview
•
•
•
•
•
•
•
More about the assembler and linker
Operators and expressions
JMP and LOOP instructions
Indirect addressing
Debugging workshop
More 80386 and 80486 instructions
Using a link library
Irvine, Kip R. Assembly Language For Intel-Based Computers
More About the Assembler and Linker
Topics:
• Source Listing
• Map File
• Memory models
• Overlapping segments
• Target processor directives
Irvine, Kip R. Assembly Language For Intel-Based Computers
Source Listing
Exchange Two Variables
3
0000
.model small
4
0000
.stack 100h
5
6
0000
.code
7
0000
main proc
8
0000 B8 0000s
9
0003 8E D8
10 0005
swap:
11 0005 A0 0000r
12 0008 86 06 0001r
13 000C A2 0000r
14 000F B8 4C00
15 0012 CD 21
16 0014
main endp
17
18 0014
.data
19 0000 0A
value1
20 0001 14
value2
21
22
end main
(SAMPLE.ASM)
mov
mov
ax,@data ; initialize DS register
ds,ax
mov
xchg
mov
mov
int
al,value1
al,value2
value1,al
ax,4C00h
21h
;
;
;
;
load the AL register
exchange AL, value2
store new value of AL
return to DOS
db 0Ah
db 14h
Irvine, Kip R. Assembly Language For Intel-Based Computers
Map File
Segments always begin on even-paragraph
boundaries.
Start
00000H
00020H
00030H
Stop
00013H
00021H
0012FH
Length
00014H
00002H
00100H
Name
_TEXT
_DATA
STACK
Program entry point at 0000:0000
Irvine, Kip R. Assembly Language For Intel-Based Computers
Class
CODE
DATA
STACK
Memory Models
Model
Description
Tiny
Code and data combined must be less than 64K.
Small
Code <= 64K, data <= 64K. One code segment,
one data segment.
Medium
Data <= 64K, code any size. Multiple code
segments, one data segment.
Compact
Code <= 64K, data any size. One code segment,
multiple data segments.
Large
Code >64K, data > 64K. Multiple code and data
segments.
Huge
Same as the Large model, except that individual
variables such as arrays may be larger than 64K.
Flat
No segments. 32-bit addresses are used for both
code and data. Protected mode only.
Irvine, Kip R. Assembly Language For Intel-Based Computers
Overlapping Segments
Start
00000
00020
00030
Stop
00010
0002F
0012F
Length
00011
00010
00100
Name
_TEXT
_DATA
STACK
Class
CODE
DATA
STACK
Program entry point at 0000:0000
Offset
00 20 30
code
130
(64K)
data
stack
Irvine, Kip R. Assembly Language For Intel-Based Computers
(64K)
(64K)
Target Processor Directives
Directive
Description
.8086
Enables assembly of 8086 and 8088 instructions. Disables
assembly of instructions for the 80186 and later processors.
Also enables 8087 instructions.
.186
Enables assembly of 80186 instructions and disables
assembly of instructions for all later processors.
.286
Enables assembly of nonprivileged 80286 instructions and
disables assembly of instructions for all later processors.
.386
Enables assembly of nonprivileged 80386 instructions and
disables assembly of instructions for all later processors.
.486
Enables assembly of nonprivileged 80486 instructions and
disables assembly of instructions for the Pentium.
.586
Enables assembly of nonprivileged Pentium instructions.
.287
Enables assembly of floating-point instructions for the 80287
math coprocessor.
.387
Enables assembly of floating-point instructions for the 80387
math coprocessor.
Irvine, Kip R. Assembly Language For Intel-Based Computers
Assembler Operators
Operator
Description
.TYPE
Returns a byte that defines the mode and scope of an expression. The result
is bit mapped and is used to show whether a label or variable is programrelated, data-related, undefined, or external in scope.
+, -, *, /
Addition, subtraction, multiplication, division of integers.
AND, OR, NOT
Bitwise operations on constant integers.
EQ, NE, LT,
LE, GT, GE
Relational operators: Assembler returns a value of 0FFFFh when a relation
is true or 0 when it is false.
HIGH
Returns the high 8 bits of a constant expession.
HIGHWORD
Returns the high 16 bits of a 32-bit operand (MASM only).
LENGTH
Returns the number of byte, word, dword, qword, or tenbyte elements in a
variable. This is meaningful only if the variable is initialized with the DUP
operator.
LOW
Returns the low 8 bits of a constant expression.
LOWWORD
Returns the low 16 bits of a 32-bit operand (MASM only).
MASK
Returns a bit mask for the bit positions in a field within a variable. A bit
mask preserves just the important bits, setting all others equal to zero. The
variable must be defined with the RECORD directive.
MOD
Modulus operator: returns the integer remainder of a division operation.
OFFSET
Returns the offset of a label or variable from the beginning of its segment.
PTR
Irvine, Kip
Specifies the size of an operand, particularly when its size is not clear from
context. Language For Intel-Based Computers
R.the
Assembly
MASK
MOD
Returns a bit mask for the bit positions in a field within a variable. A bit
mask preserves just the important bits, setting all others equal to zero. The
variable must be defined with the RECORD directive.
Assembler Operators (continued)
Modulus operator: returns the integer remainder of a division operation.
OFFSET
Returns the offset of a label or variable from the beginning of its segment.
PTR
Specifies the size of an operand, particularly when its size is not clear from
the context.
SEG
Returns the segment value of an expression, whether it be a variable, a
segment/group name, a label, or any other symbol.
SHORT
Sets a label’s attribute to SHORT. Often used in JMP instructions, as in: JMP
SHORT Label 1.
SIZE
Returns the total number of bytes allocated for a variable. This is calculated
as the LENGTH multiplied by the TYPE.
Field (.)
The name following (.) identifies a field within a predefined structure by
adding the offset of the field to the offset of the variable. The format is
variable.field.
THIS
Creates an operand of a specified type at the current program location. The
type can be any of those used with the PTR operator or the LABEL
directive.
TYPE
Returns an integer that represents either the size of a variable or its type. For
example, the TYPE of a word variable is 2.
WIDTH
Returns the number of bits of a given field within a variable that has been
declared with the RECORD directive.
Irvine, Kip R. Assembly Language For Intel-Based Computers
Operator Precedence Table
Operator
Level
Description
()
1
Parentheses
+, -
2
Positive and negative signs (unary)
* , / , mod
3
Multiplication, Division, Modulus
+, -
4
Addition, Subtraction
Irvine, Kip R. Assembly Language For Intel-Based Computers
Offset, Seg, Ptr, Label, and Even
• OFFSET returns the 16-bit address (offset) of
a label
• SEG returns the segment portion of a label's
address
• PTR overrides the default size of an operand
• LABEL redefines the size attribute of a data
label
• EVEN aligns the next instruction to a 16-bit
boundary
• EVENDATA aligns the next data label on a
16-bit boundary
Irvine, Kip R. Assembly Language For Intel-Based Computers
TYPE and SIZE Operators
• TYPE
– returns the size, in bytes of a single element of a
data label (variable)
• LENGTH
– returns a count of the number of individual
elements in a data label that uses the DUP
operator
• SIZE
– returns the product of TYPE * LENGTH
Irvine, Kip R. Assembly Language For Intel-Based Computers
TYPE
TYPE returns the size attribute:
.data
myByte
myWord
myDouble
myQuad
db
dw
dd
dq
.code
mov ax,TYPE
mov ax,TYPE
mov ax,TYPE
mov ax,TYPE
1,2,3,4
1000h,2000h,3000h
12345678h
1,2,3
myByte
myWord
myDouble
myQuad
;
;
;
;
1
2
4
8
Irvine, Kip R. Assembly Language For Intel-Based Computers
LENGTH
Returns a count of the number of individual
elements in a data label that uses the DUP
operator:
.data
myByte
myWord
db 20 dup(?)
dw 5 dup(0)
.code
mov ax,LENGTH myByte
mov ax,LENGTH myWord
; 20
; 5
Irvine, Kip R. Assembly Language For Intel-Based Computers
SIZE
Returns TYPE multiplied by LENGTH:
.data
myByte
myWord
db 20 dup(?)
dw 5 dup(0)
.code
mov ax,SIZE myByte
mov ax,SIZE myWord
; 20 (20 * 1)
; 10 (5 * 2)
Irvine, Kip R. Assembly Language For Intel-Based Computers
JMP and LOOP Instructions
• JMP is an unconditional jump to a code label
• LOOP creates a counting loop, using CX as
the default counter
– LOOPD uses ECX as the counter register
– LOOPW uses CX as the counter register
• (only necessary in 32-bit mode programming)
Irvine, Kip R. Assembly Language For Intel-Based Computers
JMP: Distance Modifiers
– JMP SHORT destination
• +/- 127 bytes
– JMP NEAR PTR destination
• same code segment
• (default in the small and compact memory
models)
– JMP FAR PTR destination
• different code segment
• (default in the large, medium, and huge
memory models)
Irvine, Kip R. Assembly Language For Intel-Based Computers
JMP Example
Unconditional Transfer of control to a label:
Label1:
.
.
jmp Label1
Irvine, Kip R. Assembly Language For Intel-Based Computers
LOOP Instruction
• Automatically uses CX as the counter
– decrements it automatically
• If CX > 0, LOOP transfers control to a label
– otherwise, excecution drops through
Irvine, Kip R. Assembly Language For Intel-Based Computers
LOOP Example
Task: sum the integers { 1,2,3,4,5 }
mov
mov
mov
cx,5
bx,1
ax,0
; loop counter
; value to be added
; holds the sum
L1:
add ax,bx
inc bx
Loop L1
; AX=000F, BX=0006, CX=0000
Irvine, Kip R. Assembly Language For Intel-Based Computers
Indirect Addressing
• Indirect Operands
[si]. [di], [bx], [bp]
• Based and Indexed Operands
array[si],
array[di],
array[bx]
• Base-Index Operands
[bx+si], [bx+di]
• Base-Index with Displacement
array[bx+si],
array[bx+di]
Irvine, Kip R. Assembly Language For Intel-Based Computers
Indirect Operand Example
.data
aString db "ABCDEFG“
.code
mov bx,offset aString
add bx,5
mov dl,[bx]
0200
0205
A B C D E F G
aString
...........
[bx]
Irvine, Kip R. Assembly Language For Intel-Based Computers
Adding 8-bit Integers
.data
aList db 10h,20h,30h
sum
db 0
.code
mov bx,offset aList
mov al,[bx]
inc bx
add al,[bx]
inc bx
add al,[bx]
mov si,offset sum
mov [si],al
; AL = 10h
; AL = 30h
; AL = 60h
; get offset of sum
; store the sum
If you want to paste a code example such as this into a program,
remember that the code segment must always begin with the
following statements:
mov ax,@data
mov ds,ax
Irvine, Kip R. Assembly Language For Intel-Based Computers
Adding 16-bit Integers
.data
wordList dw 1000h,2000h,3000h, 0
.code
mov bx,offset wordList
mov ax,[bx]
; first number
add ax,[bx+2]
; second number
add ax,[bx+4]
; third number
mov [bx+6],ax
; store the sum
1000
[bx]
2000 C3000
(sum)
[bx+2] [bx+4] [bx+6]
Irvine, Kip R. Assembly Language For Intel-Based Computers
32-Bit Registers
The .386 directive permits any of the following
registers to be used as indirect operands:
EAX, EBX, ECX, EDX, ESI, EDI, EBP
.386
mov ax,[ebx+3]
mov dl,string[edx]
mov ecx,[esi]
mov ebx,[eax]
Irvine, Kip R. Assembly Language For Intel-Based Computers
Displaying a String
.data
string db "This is a string."
COUNT = ($–string) ; calculate string length
.code
mov
mov
L1:
mov
mov
int
inc
Loop
cx,COUNT
; loop counter
si,offset string
ah,2
dl,[si]
21h
si
L1
;
;
;
;
;
DOS function: display char
get character from array
display it now
point to next character
decrement CX, repeat until 0
Irvine, Kip R. Assembly Language For Intel-Based Computers
Summing an Integer Array
.data
intarray dw 0100h,0200h,0300h,0400h
COUNT = ($ – intarray) / (TYPE intarray)
.code
mov
mov
mov
L1:
add
add
Loop
ax,0
; zero accumulator
di,offset intarray ; address of array
cx,COUNT
; loop counter
ax,[di]
di,TYPE intarray
L1
; add an integer
; point to next integer
; repeat until CX = 0
Irvine, Kip R. Assembly Language For Intel-Based Computers
Based and Indexed Operands
The microsoft assembler permits the same address
expression to be notated in various ways:
Register Added to an
Offset
Register Added to a
Constant
mov dx, ar r ay[ bx]
mov ax, [ bx + ROWVAL]
mov dx, [ di + ar r ay]
mov dx, [ bp+4]
mov dx, [ ar r ay+si ]
mov dx, 2[ si ]
Irvine, Kip R. Assembly Language For Intel-Based Computers
Two-Dimensional Array Example
Each row of this table contains five bytes. BX points to
the beginning of the second row:
.data
ROWSIZE = 5
array db 2h, 16h, 4h, 22h, 13h
db 19h, 42h, 64h, 44h, 88h
.code
mov bx,ROWSIZE
mov al,array[bx]
; AL = 19h
0200
0205
02 16 04 22 13 19 42 64 44
array
[BX]
88
...............
.
(BX = 0005)
Irvine, Kip R. Assembly Language For Intel-Based Computers
Based-Index Operands
Add the value of a base register to an
index register, producing an effective
address of 0157:
BX = 0155, SI = 0002
0150
0155
0157
10 20 30 40 50 60 70 80 90
[BX]
A0 B0 C0 D0 E0 F0
[BX + SI]
Example...
Irvine, Kip R. Assembly Language For Intel-Based Computers
Base-Index Example
.data
ROWSIZE = 5
array db 10h, 20h, 30h, 40h, 50h
db 60h, 70h, 80h, 90h,0A0h
db 0B0h,0C0h,0D0h,0E0h,0F0h
.code
mov bx,offset array
add bx,ROWSIZE
mov si,2
mov al,[bx + si]
;
;
;
;
point to the array at 0150
choose second row
choose third column
get the value at 0157
Irvine, Kip R. Assembly Language For Intel-Based Computers
Base-Index with Displacement
.data
ROWSIZE = 5
array db 10h, 20h, 30h, 40h, 50h
db 60h, 70h, 80h, 90h,0A0h
db 0B0h,0C0h,0D0h,0E0h,0F0h
.code
mov bx,ROWSIZE
mov si,2
mov dl,array[bx + si]
0150
0155
0157
10 20 30 40 50 60 70 80 90
[BX]
; row 1
; column 2
; DL = 80h
A0 B0 C0 D0 E0 F0
[BX + SI]
Irvine, Kip R. Assembly Language For Intel-Based Computers
Debugging Workshop
Irvine, Kip R. Assembly Language For Intel-Based Computers
Mismatching Operand Sizes
1:
title Mismatching Operand Sizes
2:
3:
.model small
4:
.stack 100h
5:
.code
6:
main proc
7:
mov
ax,@data
8:
mov
ds,ax
9:
mov
ax,value1
10:
mov
ah,value2
11:
mov
ax,4C00h
12:
int
21h
13:
main endp
14:
15:
.data
16: value1
db
0Ah
17: value2
dw
1000h
18: end main
(9): warning A4031: Operand types must match
(10): warning A4031: Operand types must match
Irvine, Kip R. Assembly Language For Intel-Based Computers
Miscellaneous Errors
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
title Miscellaneous Errors Program
.model small
.stack 100h
.code
main proc
mov
ax,@data
mov
ds,ax
mov
ax,bx * cx
mov
bx,value1 * 2
mov
byte ptr value3,al
mov
cx,ax
mov
cs,ds
mov
ax,4C00h
int
21h
main endp
.data
value1
db
0Ah
value2
db
14h
value3
dw
1000h
end main
Irvine, Kip R. Assembly Language For Intel-Based Computers
Intel386 and Intel486 Instructions
• MOVZX - Move with zero-extend
– moves 8-bit operand into a 16-bit register, fills
upper bits with zeros
– moves 16-bit operand into a 32-bit register, fills
upper bits with zeros
• MOVSX - Move with sign-extend
– moves 8-bit operand into a 16-bit register, sign
extends into upper bits
– moves 16-bit operand into a 32-bit register, sign
extends into upper bits
Irvine, Kip R. Assembly Language For Intel-Based Computers
MOVZX and MOVSX Examples
.data
var16 dw 1234h
var8 db -2
; FEh
.code
mov
movzx
movzx
movsx
; AX = 0022h
; EDX = 00001234h
; CX = FFFEh
bl,22h
ax,bl
edx,var16
cx,var8
Irvine, Kip R. Assembly Language For Intel-Based Computers
XADD Instruction
XADD op-left, op-right
Adds operands and stores sum in op-left. Saves
the starting value of op-left and stores it in op-right.
.code
mov
ax,1000h
mov
bx,2000h
xadd ax,bx
; AX = 1000h, BX = 2000h
; AX = 3000h, BX = 1000h
Irvine, Kip R. Assembly Language For Intel-Based Computers
Using a Link Library
• IRVINE.LIB is supplied with the book's
sample programs
– Complete list of procedures is in Appendix E
• EXTRN directive
– notifies the assembler that a procedure, constant,
or variable is located outside the current program
module
– EXTRN name:type
Irvine, Kip R. Assembly Language For Intel-Based Computers
Data Types for the EXTRN Directive
Type
Description
ABS
A constant defined with EQU or =
PROC
Default type for a procedure
NEAR
Name is in the same segment
FAR
Name is in a different segment
BYTE
Size is 8 bits
WORD
Size is 16 bits
DWORD
Size is 32 bits
FWORD
Size is 48 bits
QWORD
Size is 64 bits
TBYTE
Size is 10 bytes
Irvine, Kip R. Assembly Language For Intel-Based Computers
Selected Procedures in the Link Library
Procedure
Description
Clrscr
Clear the screen and locate the cursor at the upper left corner.
Crlf
Write a carriage return and line feed to standard output.
Get_time
Retrieve the current time of day. Input: DS:SI points to a
TimeRecord structure. Requires the console.inc include file.
Gotoxy
Locate the cursor at a specified row and column on the screen.
Input: DH = row (0-24), DL = column (0-79).
Random_range
Generate a pseudorandom integer in EAX between 0 and n–1.
Input: EAX contains n.
Random32
Generate a 32-bit pseudorandom integer in the range 0 to
FFFFFFFFh. Output: EAX contains the number.
Randomize
Automatically seed the random number generator with a random
value, based on the current time of day.
Readint
Read a signed ASCII decimal string from standard input and store
it as a 16-bit binary integer. Output: AX contains the value.
Readchar
Try to read a character from standard input without echoing the
character on the screen. Output: If a character is waiting, ZF = 0
and AL contains the character. If no character is waiting, ZF = 1.
Readkey
Wait for a single key to be pressed on the keyboard. Cannot be
redirected. Output: AH = key scan code, AL = ASCII code.
Irvine, Kip R. Assembly Language For Intel-Based Computers
Selected Procedures in the Link Library
Procedure
Description
Readlong
Read a signed ASCII decimal string from standard input and store
it as a 32-bit binary integer. Output: EAX contains the value.
Readstring
Read a string of characters from standard input and store them in a
null-terminated string. Input: DX points to the string, CX =
maximum character count. Output: AX = number of characters
typed.
Scroll
Scroll a window on the screen with a chosen color. Input: CH, CL
= upper left corner row and column; DH, DL = lower right row
and column; BH = attribute (color) of the scrolled lines.
Seconds_today
Return the number of seconds that have passed since midnight.
Output: EAX contains the seconds.
Show_time
Write a given time to standard output. Input: DS:SI points to a
TimeRecord structure.
Waitchar
Wait for a character to be read from standard input. Does not echo
the character on the console. Output: AL contains the character.
Writechar
Write a single character to standard output. Input: AL contains the
character.
Writeint
Write an unsigned 16-bit integer to standard output in ASCII
binary, decimal, octal, or hexadecimal format. Input: AX = the
integer to display, and BX = radix value (2, 8, 10, or 16).
Writeint_signed
Write a 16-bit integer to standard output in signed decimal ASCII
format. Input: AX = the integer to display.
Writestring
Write a null-terminated string to standard output. Input: DX points
to the string.
Irvine, Kip R. Assembly Language For Intel-Based Computers
Link Library Demo Program
Title Link Library Demo Program
(lnkdemo.asm)
; This program calls various I/O procedures
; in the link library.
.model small
.stack 100h
WhiteOnBlue = 1Fh
GreetingLoc = 0400h
.data
greeting
db "Link Library Demo Program"
db 0dh,0ah,0dh,0ah
db "What is your name? ",0
numberPrompt db 0dh,0ah
db "Please enter a 16–bit integer: ",0
userName
db 50 dup(0)
pressAnyKey db 0dh,0ah,0dh,0ah
db "Press any key...",0
.code
extrn Clrscr:proc, Crlf:proc, Gotoxy:proc, \
Readint:proc, Readstring:proc, Scroll:proc, \
Readkey:proc, Writeint:proc, Writestring:proc
Irvine, Kip R. Assembly Language For Intel-Based Computers
Link Library Demo, continued
main proc
mov ax,@data
mov ds,ax
; Clear the screen, scroll a blue window.
call
mov
mov
mov
call
Clrscr
cx,0400h
dx,0B28h
bh,WhiteOnBlue
Scroll
; upper–left corner
; lower–right corner
; Display a greeting and ask for the
; user’s name.
mov
call
mov
call
mov
call
dx,GreetingLoc
Gotoxy
dx,offset greeting
Writestring
dx,offset userName
Readstring
Irvine, Kip R. Assembly Language For Intel-Based Computers
Link Library Demo, continued
; Ask the user to enter a signed decimal integer.
; Redisplay the number in hexadecimal and binary.
mov
call
call
call
mov
call
call
mov
call
dx,offset numberPrompt
Writestring
Readint
; input an integer
Crlf
bx,16
; display in hexadecimal
Writeint
Crlf
bx,2
; display in binary
Writeint
mov
call
call
call
dx,offset pressAnyKey
Writestring
Readkey
Clrscr
mov ax,4c00h
int 21h
main endp
end main
; end program
Irvine, Kip R. Assembly Language For Intel-Based Computers
Generating Random Integers
Generate 20 random integers between 0 and 999.
.code
extrn Randomize:proc, Random_range:proc
extrn WriteInt:proc, Crlf:proc
call Randomize
mov cx,20
L1: mov
call
mov
call
call
Loop
eax,1000
Random_range
bx,10
WriteInt
Crlf
L1
; EAX = random integer
; decimal radix
Irvine, Kip R. Assembly Language For Intel-Based Computers
Delay_seconds Procedure
Pause for a specified number of seconds.
extrn Seconds_today:proc
Delay_seconds proc
pusha
mov ecx,eax
call Seconds_today
mov ebx,eax
DLY1:
call
sub
cmp
jb
Seconds_today
eax,ebx
eax,ecx
DLY1
; delay, in seconds
; save start time
;
;
;
;
get the time
subtract from start
delay finished yet?
if not, continue loop
popa
ret
Delay_seconds endp
Irvine, Kip R. Assembly Language For Intel-Based Computers
The End
Irvine, Kip R. Assembly Language For Intel-Based Computers
title
text
.code
Irvine, Kip R. Assembly Language For Intel-Based Computers
title
text
.code
Irvine, Kip R. Assembly Language For Intel-Based Computers