Control in Assembly

Download Report

Transcript Control in Assembly

‫‪Assembly‬‬
‫תרגול ‪5‬‬
‫תכנות באסמבלי‪ ,‬המשך‬
Condition Codes

Single bit registers
– carry flag. Unsigned overflow.
 ZF – zero flag. Zero result.
 SF – sign flag. Negative result.
 OF – overflow flag. Signed overflow.
 CF




Relevant only for the most recent operation
leal does not alter any condition code
In logical operations, CF and OF are set to 0
For shift operations, OF is set to 0, CF is the last
shifted out bit
Setting Condition Codes
Specific instructions that alter only the
condition codes.


test command only changes ZF and SF
Setting Condition Codes (cont.)
Explicit Setting by Compare Instruction
cmpl Src2,Src1
 cmpl b,a like computing a-b without
setting destination
 CF

set if carry out from most significant bit
Used for unsigned comparisons
set if a == b
 SF set if (a-b) < 0
 ZF
 OF
set if two’s complement overflow
(a>0 && b<0 && (a-b)<0) || (a<0 && b>0
&& (a-b)>0)
Setting Condition Codes (cont.)
Explicit Setting by Test instruction
testl Src2,Src1
 Sets
condition codes based on value of Src1
& Src2

Useful to have one of the operands be a mask
testl b,a like computing a&b without
setting destination . Sets only ZF and SF
others get 0.
 ZF set when a&b == 0
 SF set when a&b < 0

Accessing the Condition Codes

D - one of the small 8 bit registers
Why does it work?
Let’s take cmpl b,a for example
there is no overflow and a≥b

 If there is no overflow and a<b

 If there is a negative overflow (a>b) 
 If there is a positive overflow (a<b) 
 If
SF=0, OF=0
SF=1, OF=0
SF=1, OF=1
SF=0, OF=1
a < b in assembly

Translate the line: return (a<b);
a < b in assembly

Translate the line: return (a<b);
Solution :
 Suppose a is in %edx, b is in %eax:
cmpl %eax,%edx
# compare a to b
setl %al
movzbl %al,%eax
# set %al to 0 or 1
# set %eax to 0 or 1
Jump Instructions
Unconditional Jump - always
jumps ! Dangerous !

Direct jump - to label
jmp L1

Indirect jump
 jmp
*%eax - value inside register
as jump to address
 jmp *(%eax) - value inside
register as address containing the
jump to address
Conditional Jump

Can’t use indirect jump - must jump to label and
not to address or register value

Use it to implement
 if
conditions
 loops
 switch statements
Easiest to understand by converting to “go
to” format.

Goto in C
If Condition in Assembly
If Condition in Assembly
Do-While Loops
Do-While Loops in Assembly
While Loops
Exercise
Register
%eax
%ebx
%ecx
%edx
Variable
Initially
Exercise’s Solution
Register
Variable
Initially
%eax
a
a
%ebx
b
b
%ecx
i
0
%edx
result
a



.p2align 4,,7- a command to the assembler that
says I want the following command to start at an
address that divides by 16 (2^4), while not
wasting more than 7 bytes in order to achieve
this. Inserts zeros at the end.
Usually done for commands that we will use a lot
- make sure they sit in an efficient place in
memory.
This alignment often improves cache hits (which
reduces memory latency), as spatially local
memory will end up in the same cache line /
memory page.
Exercise’s Solution
Note the optimization done by the compiler!
For Loops
Exercise
Exercise’s Solution
Note the optimization done by the compiler!
Exercise’s Solution
Note the optimization done by the compiler!
( Removal of y*x out of the loop )
Switch Statements in C
Switch Statements in Assembly
Building the jump table in the read only data section :
Switch Statements in Assembly
Calculates the case as the address I will
jump to.
 Each table entry has to be the same size
for easy address calculation.
 Have to have some kind of value for each
entry ( can have no missing entries missing ones will get a default value ).
 Will jump to : ‘index’ * 4 + initial table
address.

Switch Statements in Assembly
Switch Statements in Assembly
Exercise
Q&A

Q:



What were the values of the case labels in
the switch statement body?
What cases had multiple labels in the C
code?
A:


The case labels had values -2,0,1,2,3,4
The case with the labels 2 and 3