# CAOS Exercise Session Lecture 4



``` c
long lt_cnt = 0;
long ge_cnt = 0;
long absdiff_se(long x, long y) {
long result;
if(x < y) {
lt_cnt++;
result = y - x;
} else {
ge_cnt++;
result = x - y;
}
return result;
}
long absdiff_se2(long x, long y) {
long result;
int t = x < y;
if(t)
goto true;
ge_cnt++;
result = x - y;
goto done;
true:
lt_cnt++;
result = y - x;
done:
return result;
}
```


>fejl i opgave: C-koden bør anvende longs, ikke shorts
Istedet for %rbx, skal %rax benyttes
fejl i løsning: se evt mit forslag istedet for bogens.
Fejl i bogens løsning: (sidste betingelse skal være y>=10)
(bemærk også at idivq instruktionen kun findes som enkelt-operand instruktion, se afsnit CPP 3.5.5, men ignorer dette for nuværende)
3
```c
long test(long x, long y) {
long val = 12 + y;
if (x == 0) {
if (y == 10)
val = x;
else
val = 0;
}
else if (-----)
val = -----;
return val;
}
```
rbx = val = 12 * y = 12 * rsi
if(x == 0) {
y / x = y / 0 = 0 y = 0
10 - y = 10 - 0
val = x = 0
} else {
}


| Array | Element size | Total size | Start address | Element $i$ |
|-------|--------------|------------|---------------|-----------|
| P | 4 bytes| 20 bytes | $x_P$ | $(x_P, i, 4)$ |
| Q | 2 bytes | 4 bytes | $x_Q$ | $(x_Q, i, 2)$ |
| R | 4 bytes | 52 bytes | $x_R$ | $(x_R, i, 4)$ |
| S | 8 bytes | 88 bytes | $x_S$ | $(x_S, i, 8)$ |
| T | 2 bytes | 12 bytes | $x_T$ | |
