Machine-Level Programming IV: Structured Data Apr. 23, 2008 Topics Arrays Structures Unions EECS213.

Slides:



Advertisements
Similar presentations
Instructor: Erol Sahin
Advertisements

Machine-Level Programming IV: Structured Data Feb 5, 2004 Topics Arrays Structs Unions class08.ppt “The course that gives CMU its Zip!”
University of Washington Data Structures! Arrays  One-dimensional  Multi-dimensional (nested)  Multi-level Structs  Alignment Unions 1.
Structured Data: Sept. 20, 2001 Topics Arrays Structs Unions class08.ppt “The course that gives CMU its Zip!”
Machine-Level Programming IV: Data Sept. 19, 2007 Structured Data Arrays Structs UnionsData/Control Buffer overflow class07.ppt F’07.
IA32 Stack Discipline From Last Time
Machine-Level Programming IV: Structured Data Topics Arrays Structures Unions CS213.
Structured Data I: Homogenous Data Sept. 17, 1998 Topics Arrays –Single –Nested Pointers –Multilevel Arrays Optimized Array Code class08.ppt “The.
– 1 – Referencing Examples Code Does Not Do Any Bounds Checking! ReferenceAddressValueGuaranteed? mit[3]36 + 4* 3 = 483 Yes mit[5]36 + 4* 5 = 566 No mit[-1]36.
1 Introduction to x86 Assembly, part II or “What does my laptop actually do?” Ymir Vigfusson Some slides gracefully borrowed from
1 1 Machine-Level Programming IV: x86-64 Procedures, Data Andrew Case Slides adapted from Jinyang Li, Randy Bryant & Dave O’Hallaron.
1 1 Machine-Level Programming IV: x86-64 Procedures, Data.
Machine-Level Programming 6 Structured Data Topics Structs Unions.
Machine-Level Programming III: Procedures Topics IA32 stack discipline Register saving conventions Creating pointers to local variables class07.ppt.
Machine-Level Programming IV: Structured Data Topics Arrays Structs Unions CS 105 “Tour of the Black Holes of Computing”
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming IV: Data : Introduction.
Instructors: Greg Ganger, Greg Kesden, and Dave O’Hallaron
1 Procedure Call and Array. 2 Outline Data manipulation Control structure Suggested reading –Chap 3.7, 3.8.
University of Amsterdam Computer Systems – Data in C Arnoud Visser 1 Computer Systems New to C?
Machine-level Programming IV: Data Structures Topics –Arrays –Structs –Unions.
Lecture 9 Aggregate Data Organization Topics Pointers Aggregate Data Array layout in memory Structures February 14, 2012 CSCE 212 Computer Architecture.
University of Washington Today Lab 3 out  Buffer overflow! Finish-up data structures 1.
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming IV: Data Topics: Arrays.
Fabián E. Bustamante, Spring 2007 Machine-Level Prog. IV - Structured Data Today Arrays Structures Unions Next time Arrays.
Machine-Level Programming IV: Structured Data
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming IV: Data MCS284: Computer.
Machine-Level Programming IV: Structured Data Topics Arrays Structs Unions CS 105 “Tour of the Black Holes of Computing”
Recitation 3 Outline Recursive procedure Complex data structures –Arrays –Structs –Unions Function pointer Reminders Lab 2: Wed. 11:59PM Lab 3: start early.
1 Array. 2 Outline Aggregate scalar data into larger data Pointers vs. Array Array subscript and pointer arithmetic Memory layout for array –Static vs.
Lecture 9 Aggregate Data Topics Arrays Structs Unions again Lab 02 comments Vim, gedit, February 22, 2016 CSCE 212 Computer Architecture.
Machine-Level Programming IV: Data
Machine-Level Programming IV: Data
Arrays CSE 351 Spring 2017 Instructor: Ruth Anderson
Machine-Level Programming IV: Structured Data
Machine-Level Programming IV: Data
Machine-Level Programming IV: Structured Data Sept. 30, 2008
Referencing Examples Code Does Not Do Any Bounds Checking!
Machine-Level Programming IV: x86-64 Procedures, Data
Machine-Level Programming 5 Structured Data
Machine-Level Programming IV: Data CSCE 312
Machine-level Programming IV: Data Structures
IA32 Stack Discipline From Last Time
Feb 2 Announcements Arrays/Structs in C Lab 2? HW2 released
IA32 Stack Discipline From Last Time
Machine-Level Programming IV: Data September 8, 2008
Machine-Level Programming 6 Structured Data
Machine-Level Programming IV: Structured Data Sept. 19, 2002
Machine-Level Programming IV: Data
Instructor: Phil Gibbons
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Instructors: Majd Sakr and Khaled Harras
Machine-Level Programming IV: Structured Data
Machine-Level Programming IV: Data
Machine-Level Programming IV: Data /18-213/14-513/15-513: Introduction to Computer Systems 8th Lecture, September 20, 2018.
Instructors: Majd Sakr and Khaled Harras
Machine Level Representation of Programs (III)
Machine-Level Programming VIII: Data Comp 21000: Introduction to Computer Systems & Assembly Lang Spring 2017 Systems book chapter 3* * Modified slides.
Arrays CSE 351 Winter 2018 Instructor: Mark Wyse Teaching Assistants:
Machine-Level Programming 5 Structured Data
Machine-Level Programming 5 Structured Data
Machine-Level Programming IV: Structured Data
Structured Data I: Homogenous Data Feb. 10, 2000
Instructor: Fatma CORUT ERGİN
Machine-Level Programming VIII: Data Comp 21000: Introduction to Computer Systems & Assembly Lang Spring 2017 Systems book chapter 3* * Modified slides.
Data Spring, 2019 Euiseong Seo
Machine-Level Programming VIII: Data Comp 21000: Introduction to Computer Systems & Assembly Lang Spring 2017 Systems book chapter 3* * Modified slides.
Machine-Level Programming IV: Structured Data
Machine-Level Programming IV: Data
Machine-Level Programming IV: Structured Data
Machine-Level Programming IV: Structured Data
Presentation transcript:

Machine-Level Programming IV: Structured Data Apr. 23, 2008 Topics Arrays Structures Unions EECS213

– 2 – EECS213, S’08 Basic Data Types Integral Stored & operated on in general registers IntelGASBytesC byte b 1[ unsigned ] char word w 2[ unsigned ] short double word l 4[ unsigned ] int Floating Point Stored & operated on in floating point registers IntelGASBytesC Single s 4 float Double l 8 double Extended t 10/12 long double

– 3 – EECS213, S’08 Array Allocation Basic Principle T A[ L ]; Array of data type T and length L Contiguously allocated region of L * sizeof( T ) bytes char string[12]; xx + 12 int val[5]; x x + 4x + 8x + 12x + 16x + 20 double a[4]; x + 32 x + 24 x x + 8x + 16 char *p[3]; x x + 4x + 8

– 4 – EECS213, S’08 Array Access Basic Principle T A[ L ]; Array of data type T and length L Identifier A can be used as a pointer to array element 0 ReferenceTypeValue val[4]int3 valint * x val+1int * x + 4 &val[2]int * x + 8 val[5]int ?? *(val+1)int5 val + i int * x + 4 i int val[5]; x x + 4x + 8x + 12x + 16x + 20

– 5 – EECS213, S’08 Array Example Notes Declaration “ zip_dig cmu ” equivalent to “ int cmu[5] ” Example arrays were allocated in successive 20 byte blocks Not guaranteed to happen in general typedef int zip_dig[5]; zip_dig cmu = { 1, 5, 2, 1, 3 }; zip_dig mit = { 0, 2, 1, 3, 9 }; zip_dig ucb = { 9, 4, 7, 2, 0 }; zip_dig cmu; zip_dig mit; zip_dig ucb;

– 6 – EECS213, S’08 Array Accessing Example Memory Reference Code int get_digit (zip_dig z, int dig) { return z[dig]; } # %edx = z # %eax = dig movl (%edx,%eax,4),%eax # z[dig] Computation Register %edx contains starting address of array Register %eax contains array index Desired digit at 4*%eax + %edx Use memory reference (%edx,%eax,4)

– 7 – EECS213, S’08 Referencing Examples Code Does Not Do Any Bounds Checking! ReferenceAddressValueGuaranteed? mit[3]36 + 4* 3 = 483 mit[5]36 + 4* 5 = 569 mit[-1]36 + 4*-1 = 323 cmu[15]16 + 4*15 = 76?? Out of range behavior implementation-dependent No guaranteed relative allocation of different arrays zip_dig cmu; zip_dig mit; zip_dig ucb; Yes No No No

– 8 – EECS213, S’08 int zd2int(zip_dig z) { int i; int zi = 0; for (i = 0; i < 5; i++) { zi = 10 * zi + z[i]; } return zi; } Array Loop Example Original Source int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } Transformed Version As generated by GCC Eliminate loop variable i Convert array code to pointer code Express in do-while form No need to test at entrance

– 9 – EECS213, S’08 # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop Array Loop Implementation Registers %ecxz %eaxzi %ebxzendComputations 10*zi + *z implemented as *z + 2*(zi+4*zi) z++ increments by 4 int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } # %ecx = z xorl %eax,%eax# zi = 0 leal 16(%ecx),%ebx# zend = z+4.L59: leal (%eax,%eax,4),%edx# 5*zi movl (%ecx),%eax# *z addl $4,%ecx# z++ leal (%eax,%edx,2),%eax# zi = *z + 2*(5*zi) cmpl %ebx,%ecx# z : zend jle.L59# if <= goto loop int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; }

– 10 – EECS213, S’08 Array reference quiz Assume short S[], int i %edx = &S[0], %ecx = i For each expression, give its type and the assembly code to store its value in %eax, if pointer, or %ax if short ExpressionTypeCode S+1 S[3] &S[i] S[4*i+1] S+i-5

– 11 – EECS213, S’08 Nested Array Example Declaration “ zip_dig pgh[4] ” equivalent to “ int pgh[4][5] ” Variable pgh denotes array of 4 elements »Allocated contiguously Each element is an array of 5 int ’s »Allocated contiguously “Row-Major” ordering of all elements guaranteed #define PCOUNT 4 zip_dig pgh[PCOUNT] = {{1, 5, 2, 0, 6}, {1, 5, 2, 1, 3 }, {1, 5, 2, 1, 7 }, {1, 5, 2, 2, 1 }}; zip_dig pgh[4];

– 12 – EECS213, S’08 Nested Array Allocation Declaration T A[ R ][ C ]; Array of data type T R rows, C columns Type T element requires K bytes Array Size R * C * K bytesArrangement Row-Major Ordering A[0][0]A[0][C-1] A[R-1][0] A[R-1][C-1] int A[R][C]; A [0] A [0] [C-1] A [1] [0] A [1] [C-1] A [R-1] [0] A [R-1] [C-1] 4*R*C Bytes

– 13 – EECS213, S’08 Nested Array Row Access Row Vectors A[i] is array of C elements Each element of type T Starting address A + i * C * K A [i] [0] A [i] [C-1] A[i] A [R-1] [0] A [R-1] [C-1] A[R-1] A A [0] A [0] [C-1] A[0] int A[R][C]; A+i*C*4A+(R-1)*C*4

– 14 – EECS213, S’08 Nested Array Row Access Code Row Vector pgh[index] is array of 5 int ’s Starting address pgh+20*indexCode Computes and returns address Compute as pgh + 4*(index+4*index) int *get_pgh_zip(int index) { return pgh[index]; } # %eax = index leal (%eax,%eax,4),%eax# 5 * index leal pgh(,%eax,4),%eax# pgh + (20 * index)

– 15 – EECS213, S’08 Nested Array Element Access Array Elements Array Elements A[i][j] is element of type T Address A + (i * C + j) * K A [i] [j] A [i] [j] A[i] A [R-1] [0] A [R-1] [C-1] A[R-1] A A [0] A [0] [C-1] A[0] int A[R][C]; A+i*C*4A+(R-1)*C*4 A+(i*C+j)*4

– 16 – EECS213, S’08 Nested Array Element Access Code Array Elements pgh[index][dig] is int Address: pgh + 20*index + 4*digCode Computes address pgh + 4*dig + 4*(index+4*index) movl performs memory reference int get_pgh_digit (int index, int dig) { return pgh[index][dig]; } # %ecx = dig # %eax = index leal 0(,%ecx,4),%edx# 4*dig leal (%eax,%eax,4),%eax# 5*index movl pgh(%edx,%eax,4),%eax# *(pgh + 4*dig + 20*index)

– 17 – EECS213, S’08 Strange Referencing Examples ReferenceAddressValueGuaranteed? pgh[3][3]76+20*3+4*3 = 1482 pgh[2][5]76+20*2+4*5 = 1361 pgh[2][-1]76+20*2+4*-1 = 1123 pgh[4][-1]76+20*4+4*-1 = 1521 pgh[0][19]76+20*0+4*19 = 1521 pgh[0][-1]76+20*0+4*-1 = 72?? Code does not do any bounds checking Ordering of elements within array guaranteed zip_dig pgh[4]; Yes Yes Yes Yes Yes No

– 18 – EECS213, S’08 Multi-Level Array Example Variable univ denotes array of 3 elements Each element is a pointer 4 bytes Each pointer points to array of int ’s zip_dig cmu = { 1, 5, 2, 1, 3 }; zip_dig mit = { 0, 2, 1, 3, 9 }; zip_dig ucb = { 9, 4, 7, 2, 0 }; #define UCOUNT 3 int *univ[UCOUNT] = {mit, cmu, ucb}; univ cmu mit ucb

– 19 – EECS213, S’08 Element Access in Multi-Level Array Computation Element access Mem[Mem[univ+4*index]+4*dig] Must do two memory reads First get pointer to row array Then access element within array # %ecx = index # %eax = dig leal 0(,%ecx,4),%edx# 4*index movl univ(%edx),%edx# Mem[univ+4*index] movl (%edx,%eax,4),%eax# Mem[...+4*dig] int get_univ_digit (int index, int dig) { return univ[index][dig]; }

– 20 – EECS213, S’08 Array Element Accesses Similar C references Nested Array Element at Mem[pgh+20*index+4*dig] Different address computation Multi-Level Array Element at Mem[Mem[univ+4*index]+4*dig] int get_pgh_digit (int index, int dig) { return pgh[index][dig]; } int get_univ_digit (int index, int dig) { return univ[index][dig]; }

– 21 – EECS213, S’08 Strange Referencing Examples ReferenceAddress ValueGuaranteed? univ[2][3]56+4*3 = 682 univ[1][5]16+4*5 = 360 univ[2][-1]56+4*-1 = 529 univ[3][-1]???? univ[1][12]16+4*12 = 647 Code does not do any bounds checking Ordering of elements in different arrays not guaranteed univ cmu mit ucb Yes No No No No

– 22 – EECS213, S’08 Using Nested Arrays Strengths C compiler handles doubly subscripted arrays Generates very efficient code Avoids multiply in index computationLimitation Only works if have fixed array size #define N 16 typedef int fix_matrix[N][N]; /* Compute element i,k of fixed matrix product */ int fix_prod_ele (fix_matrix a, fix_matrix b, int i, int k) { int j; int result = 0; for (j = 0; j < N; j++) result += a[i][j]*b[j][k]; return result; } A (i,*) B (*,k) Column-wise Row-wise

– 23 – EECS213, S’08 Dynamic Nested Arrays Strength Can create matrix of arbitrary sizeProgramming Must do index computation explicitlyPerformance Accessing single element costly Must do multiplication int * new_var_matrix(int n) { return (int *) calloc(sizeof(int), n*n); } int var_ele (int *a, int i, int j, int n) { return a[i*n+j]; } movl 12(%ebp),%eax# i movl 8(%ebp),%edx# a imull 20(%ebp),%eax# n*i addl 16(%ebp),%eax# n*i+j movl (%edx,%eax,4),%eax# Mem[a+4*(i*n+j)]

– 24 – EECS213, S’08 Dynamic Array Multiplication Without Optimizations Multiplies 2 for subscripts 1 for data Adds 2 for array indexing 1 for loop index 1 for data /* Compute element i,k of variable matrix product */ int var_prod_ele (int *a, int *b, int i, int k, int n) { int j; int result = 0; for (j = 0; j < n; j++) result += a[i*n+j] * b[j*n+k]; return result; } A (i,*) B (*,k) Column-wise Row-wise

– 25 – EECS213, S’08 Optimizing Dynamic Array Mult. Optimizations Performed when set optimization level to -O2 Code Motion Expression i*n can be computed outside loop Strength Reduction Incrementing j has effect of incrementing j*n+k by nPerformance Compiler can optimize regular access patterns { int j; int result = 0; for (j = 0; j < n; j++) result += a[i*n+j] * b[j*n+k]; return result; } { int j; int result = 0; int iTn = i*n; int jTnPk = k; for (j = 0; j < n; j++) { result += a[iTn+j] * b[jTnPk]; jTnPk += n; } return result; }

– 26 – EECS213, S’08 struct rec { int i; int a[3]; int *p; }; Assembly # %eax = val # %edx = r movl %eax,(%edx)# Mem[r] = val void set_i(struct rec *r, int val) { r->i = val; } Structures Concept Contiguously-allocated region of memory Refer to members within structure by names Members may be of different types Accessing Structure Member Memory Layout iap

– 27 – EECS213, S’08 struct rec { int i; int a[3]; int *p; }; # %ecx = idx # %edx = r leal 0(,%ecx,4),%eax# 4*idx leal 4(%eax,%edx),%eax# r+4*idx+4 int * find_a (struct rec *r, int idx) { return &r->a[idx]; } Generating Pointer to Struct. Member Generating Pointer to Array Element Offset of each structure member determined at compile time iap 0416 r *idx r

– 28 – EECS213, S’08 struct rec { int i; int a[3]; int *p; }; # %edx = r movl (%edx),%ecx# r->i leal 0(,%ecx,4),%eax# 4*(r->i) leal 4(%edx,%eax),%eax# r+4+4*(r->i) movl %eax,16(%edx)# Update r->p void set_p(struct rec *r) { r->p = &r->a[r->i]; } Structure Referencing (Cont.) C Code ia 0416 Element i iap 0416

– 29 – EECS213, S’08 Structure reference quiz struct prob { int *p; int *p; struct { struct { int x; int x; int y; int y; } s; } s; struct prob *next; struct prob *next;} Offsets in bytes for a. p b. s.x c. s.y d. next Total bytes for prob ?

– 30 – EECS213, S’08 Structure reference quiz struct prob { int *p; int *p; struct { struct { int x; int x; int y; int y; } s; } s; struct prob *next; struct prob *next;} Offsets in bytes for a. p b. s.x c. s.y d. next Total bytes for prob ?

– 31 – EECS213, S’08 Structure reference quiz struct prob { int *p; int *p; struct { struct { int x; int x; int y; int y; } s; } s; struct prob *next; struct prob *next;} Offsets in bytes for a. p 0 b. s.x 4 c. s.y 8 d. next 12 Total bytes for prob ? 16

– 32 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax ____________1______________ movl 8(%eax), %edx ____________2______________ movl %edx, 4(%eax) ____________3______________ leal 4(%eax), %edx ____________4______________ movl %edx, (%eax) ____________5______________ movl %eax, 12(%eax) ____________6______________ void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = ____7_____; sp->s.x = ____7_____; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 33 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx ____________2______________ movl %edx, 4(%eax) ____________3______________ leal 4(%eax), %edx ____________4______________ movl %edx, (%eax) ____________5______________ movl %eax, 12(%eax) ____________6______________ void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = ____7_____; sp->s.x = ____7_____; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 34 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) ____________3______________ leal 4(%eax), %edx ____________4______________ movl %edx, (%eax) ____________5______________ movl %eax, 12(%eax) ____________6______________ void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = ____7_____; sp->s.x = ____7_____; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 35 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) put sp->s.y in sp->s.x leal 4(%eax), %edx ____________4______________ movl %edx, (%eax) ____________5______________ movl %eax, 12(%eax) ____________6______________ void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = ____7_____; sp->s.x = ____7_____; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 36 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) put sp->s.y in sp->s.x leal 4(%eax), %edx put &(sp->s.x) in %edx movl %edx, (%eax) ____________5______________ movl %eax, 12(%eax) ____________6______________ void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = ____7_____; sp->s.x = ____7_____; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 37 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) put sp->s.y in sp->s.x leal 4(%eax), %edx put &(sp->s.x) in %edx movl %edx, (%eax) put &(sp->s.x) in sp->p movl %eax, 12(%eax) ____________6______________ void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = ____7_____; sp->s.x = ____7_____; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 38 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) put sp->s.y in sp->s.x leal 4(%eax), %edx put &(sp->s.y) in %edx movl %edx, (%eax) put &(sp->s.y) in sp->p movl %eax, 12(%eax) put sp in sp->next void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = ____7_____; sp->s.x = ____7_____; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 39 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) put sp->s.y in sp->s.x leal 4(%eax), %edx put &(sp->s.y) in %edx movl %edx, (%eax) put &(sp->s.y) in sp->p movl %eax, 12(%eax) put sp in sp->next void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = sp->s.y; sp->s.x = sp->s.y; sp->p = ____8_____; sp->p = ____8_____; sp->next = ____9_____; sp->next = ____9_____;}

– 40 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) put sp->s.y in sp->s.x leal 4(%eax), %edx put &(sp->s.y) in %edx movl %edx, (%eax) put &(sp->s.y) in sp->p movl %eax, 12(%eax) put sp in sp->next void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = sp->s.y; sp->s.x = sp->s.y; sp->p = &(sp->s.x); sp->p = &(sp->s.x); sp->next = ____9_____; sp->next = ____9_____;}

– 41 – EECS213, S’08 Structure reference quiz movl 8(%ebp), %eax put sp in %eax movl 8(%eax), %edx put sp->s.y in %edx movl %edx, 4(%eax) put sp->s.y in sp->s.x leal 4(%eax), %edx put &(sp->s.y) in %edx movl %edx, (%eax) put &(sp->s.y) in sp->p movl %eax, 12(%eax) put sp in sp->next void sp_init (struct prob *sp) (struct prob *sp){ sp->s.x = sp->s.y; sp->s.x = sp->s.y; sp->p = &(sp->s.x); sp->p = &(sp->s.x); sp->next = sp; sp->next = sp;}