SLIDE 4 Looking more closely
c = &c[3]; *c = *&c[3]; r[0] ← 0x2000 # r[0] = &c r[1] ← m[r[0]] # r[1] = c r[2] ← 12 # r[2] = 3 * sizeof(int) r[2] ← r[2]+r[1] # r[2] = c + 3 m[r[0]] ← r[2] # c = c + 3 r[3] ← 3 # r[3] = 3 r[4] ← m[r[2]+4*r[3]] # r[4] = c[3] m[r[2]] ← r[4] # c[0] = c[3] 0x2000: 0x3000 0x3000: 0 0x3004: 1 0x3008: 2 0x300c: 3 0x3010: 4 0x3014: 5 0x3018: 6 0x301c: 7 0x3020: 8
Before
12
Looking more closely
c = &c[3]; *c = *&c[3]; r[0] ← 0x2000 # r[0] = &c r[1] ← m[r[0]] # r[1] = c r[2] ← 12 # r[2] = 3 * sizeof(int) r[2] ← r[2]+r[1] # r[2] = c + 3 m[r[0]] ← r[2] # c = c + 3 r[3] ← 3 # r[3] = 3 r[4] ← m[r[2]+4*r[3]] # r[4] = c[3] m[r[2]] ← r[4] # c[0] = c[3] 0x2000: 0x3000 0x3000: 0 0x3004: 1 0x3008: 2 0x300c: 3 0x3010: 4 0x3014: 5 0x3018: 6 0x301c: 7 0x3020: 8
Before
0x2000: 0x300c 0x3000: 0 0x3004: 1 0x3008: 2 0x300c: 6 0x3010: 4 0x3014: 5 0x3018: 6 0x301c: 7 0x3020: 8
After
c[0] = c[3]
12
r[0] ← 0x2000 # r[0] = &c r[1] ← m[r[0]] # r[1] = c r[2] ← 12 # r[2] = 3 * sizeof(int) r[2] ← r[2]+r[1] # r[2] = c + 3 m[r[0]] ← r[2] # c = c + 3 r[3] ← 3 # r[3] = 3 r[4] ← m[r[2]+4*r[3]] # r[4] = c[3] m[r[2]] ← r[4] # c[0] = c[3] ld $0x2000, r0 # r0 = &c ld (r0), r1 # r1 = c ld $12, r2 # r2 = 3*sizeof(int) add r1, r2 # r2 = c+3 st r2, (r0) # c = c+3 ld $3, r3 # r3 = 3 ld (r2,r3,4), r4 # r4 = c[3] st r4, (r2) # c[0] = c[3]
13
Example: Endianness of a Computer
#include <stdio.h> int main () { char a[4]; *((int*)a) = 1; printf("a[0]=%d a[1]=%d a[2]=%d a[3]=%d\n",a[0],a[1],a[2],a[3]); }
14