CS 301 Fall 2002 Control Structures
Download
Report
Transcript CS 301 Fall 2002 Control Structures
CS 301 Fall 2002
Control Structures
Slide Set 5
7/7/2015
1
CS 301 Fall 2001 – Chapter 7
Slides by Prof. Hartman, following
“IBM PC Assembly Language
Programming” by Peter Abel
7/7/2015
2
The Stack
Three main uses
Saving return addresses for subroutines
Passing data to subroutines
Temporarily saving contents of registers so the
program can use those registers for
computation.
7/7/2015
3
The Stack 2
SS contains the address of the beginning of
the stack, SP contains the size of the stack
(and thus points to one address past the end
of the stack)
The stack begins storing data at the highest
location in the segment and stores data
downward through memory using PUSH
and POP (and other) instructions.
7/7/2015
4
Stack Instructions
PUSH, POP to and from general register,
segment register, or memory
PUSHA, POPA – save and restore contents
of all general purpose registers (16 bytes)
PUSHF, POPF – save and restore contents
of the flags
PUSHAD, POPAD – save and restore
contents of all extended registers. (32 bytes)
7/7/2015
5
Instruction Execution and
Addressing
Processor steps in executing an instruction
1.
2.
3.
7/7/2015
Fetch next instruction from memory and place
it in instruction queue
Decode the instruction: calculate addresses
for memory references, deliver data to the
ALU, increment IP
Execute the instruction: perform the
operation, store results in register or memory,
set any required flags.
6
Address types
Short – Same segment, one byte offset, -128
to +127
Near – Same segment, two byte (80286 and
earlier) or four byte (80386 and later) offset.
Far – Different segment
7/7/2015
7
Branching Instructions
JMP can jump to Short, Near, or Far
addresses
Jxx can jump to Short or Near (80386+)
addresses
LOOP can jump to Short addresses
CALL can jump to Near or Far addresses
7/7/2015
8
Short Jumps
If the label is before the jump (jumping
back) NASM will automatically choose a
Short jump if possible.
If the label is after the jump (jumping
forward) NASM will always use a Near
jump, unless you specify
jmp short label
7/7/2015
9
NASM labels
Labels beginning with a period are “local”
labels – they are associated with the most
recent non-local label.
7/7/2015
10
Converting high-level control
structures – if/else
if ( condition ) {
// body of then_block
}
else {
// body of else_block
}
In C is roughly equivalent to the following assembly code. Note the use of local labels.
; code to set flags based on condition
jxx .else_block ; select xx to branch if false
; code for body of then_block
jmp .endif
.else_block:
; code for body of else_block
.endif:
7/7/2015
11
Converting high-level control
structures – while
while ( condition ) {
// body of loop
}
In C is roughly equivalent to the following assembly code. Note the use of local
labels.
.while:
; code to set flags based on condition
jxx .endwhile ; select xx so that branches if false
; body of loop
jmp .while
.endwhile:
7/7/2015
12
Converting high-level control
structures – do/while
do {
// body of loop
} while ( condition )
In C is roughly equivalent to the following assembly code. Note the use of local
labels.
.do:
; code for body of loop
; code to set flags based on condition
jxx .do
; select xx so branches if true
7/7/2015
13
Converting high-level control
structures – for
for(int i=0;i<10;++i) {
// body of loop
}
In C is roughly equivalent to the following assembly code. Note the use of local
labels.
mov ecx, 10
.for:
; code for body of loop
dec ecx
jnz .for
7/7/2015
14
LOOP instruction
LOOP label
LOOPE/LOOPZ label
Decrements ecx (or cx in 16-bit mode) and
branches to label unless ecx is then zero.
Adds condition that ZF=1.
LOOPNE/LOOPNZ label
7/7/2015
Adds condition that ZF=0.
15
Converting high-level control
structures – for
for(int i=0;i<10;++i) {
// body of loop
}
In C is roughly equivalent to the following assembly code. Note the use of local
labels.
mov ecx, 10
.for:
; code for body of loop
loop .for
;
7/7/2015
16
CALL and RET
CALL proc_name
Pushes IP, sets IP to offset of proc_name (and
clears processor’s prefetch instruction queue)
RET [n]
Pops IP (and clears processor’s prefetch
instruction queue)
Possibly “pops” n arguments from the stack
7/7/2015
17
Passing parameters
Can pass parameters by reference (address)
or value.
Can pass parameters in registers or on stack.
Examples using registers: regpassing.asm
7/7/2015
18
Passing parameters on the stack 1
Push parameters on the stack before the CALL
instruction
Procedure doesn’t pop them off, it accesses them
directly on the stack:
Avoids having to pop off return address then put it back
on
Allows using the parameter multiple times
Need to use indirect addressing
Examples using stack: stackpassing.asm
7/7/2015
19
Indirect Addressing
Can add registers and/or constants and/or a
location and get at what is located in the
result
MOV
MOV
MOV
MOV
MOV
7/7/2015
eax,[data]
eax,[ebx]
eax,[data+ebx]
eax,[ebx+2]
eax,[ebx*8+esp+4]
20