Computer Organization and Design Addressing Modes Montek Singh Wed, Sep 19, 2012 Lecture 6.

Slides:



Advertisements
Similar presentations
Henk Corporaal TUEindhoven 2011
Advertisements

1 Lecture 3: MIPS Instruction Set Today’s topic:  More MIPS instructions  Procedure call/return Reminder: Assignment 1 is on the class web-page (due.
Goal: Write Programs in Assembly
Review of the MIPS Instruction Set Architecture. RISC Instruction Set Basics All operations on data apply to data in registers and typically change the.
Lecture 5: MIPS Instruction Set
Branches Two branch instructions:
The University of Adelaide, School of Computer Science
1 Procedure Calls, Linking & Launching Applications Lecture 15 Digital Design and Computer Architecture Harris & Harris Morgan Kaufmann / Elsevier, 2007.
CS1104 – Computer Organization PART 2: Computer Architecture Lecture 5 MIPS ISA & Assembly Language Programming.
ITCS 3181 Logic and Computer Systems 2015 B. Wilkinson slides3.ppt Modification date: March 16, Addressing Modes The methods used in machine instructions.
1 Today’s lecture  Last lecture we started talking about control flow in MIPS (branches)  Finish up control-flow (branches) in MIPS —if/then —loops —case/switch.
1 Nested Procedures Procedures that don't call others are called leaf procedures, procedures that call others are called nested procedures. Problems may.
The University of Adelaide, School of Computer Science
Chapter 9. 2 Objectives You should be able to describe: Addresses and Pointers Array Names as Pointers Pointer Arithmetic Passing Addresses Common Programming.
Chap.2: Instructions: Language of the computer Jen-Chang Liu, Spring 2006 Adapted from
L5 – Addressing Modes 1 Comp 411 – Spring /29/08 Operands and Addressing Modes Where is the data? Addresses as data Names and Values Indirection.
Computer Structure - The Instruction Set (2) Goal: Implement Functions in Assembly  When executing a procedure (function in C) the program must follow.
RISC Concepts, MIPS ISA and the Mini–MIPS project
Data Transfer & Decisions I (1) Fall 2005 Lecture 3: MIPS Assembly language Decisions I.
Part II: Addressing Modes
MIPS Instruction Set Advantages
9/29: Lecture Topics Memory –Addressing (naming) –Address space sizing Data transfer instructions –load/store on arrays on arrays with variable indices.
IT253: Computer Organization Lecture 4: Instruction Set Architecture Tonga Institute of Higher Education.
1 Branches and Procedure Calls Lecture 14 Digital Design and Computer Architecture Harris & Harris Morgan Kaufmann / Elsevier, 2007.
Execution of an instruction
CSCI-365 Computer Organization Lecture Note: Some slides and/or pictures in the following are adapted from: Computer Organization and Design, Patterson.
Lecture 4: MIPS Instruction Set
MIPS coding. Review Shifting – Shift Left Logical (sll) – Shift Right Logical (srl) – Moves all of the bits to the left/right and fills in gap with 0’s.
 1998 Morgan Kaufmann Publishers MIPS arithmetic All instructions have 3 operands Operand order is fixed (destination first) Example: C code: A = B +
Computer Architecture CSE 3322 Lecture 3 Assignment: 2.4.1, 2.4.4, 2.6.1, , Due 2/3/09 Read 2.8.
Computer Organization and Design Addressing Modes Montek Singh Sep 30, 2015 Lecture 7.
9/29: Lecture Topics Conditional branch instructions
Computer Organization Instructions Language of The Computer (MIPS) 2.
Computer Organization and Design Pointers, Arrays and Strings in C Montek Singh Sep 18, 2015 Lab 5 supplement.
Computer Organization Rabie A. Ramadan Lecture 3.
Instruction Sets: Addressing modes and Formats Group #4  Eloy Reyes  Rafael Arevalo  Julio Hernandez  Humood Aljassar Computer Design EEL 4709c Prof:
Chapter 2 — Instructions: Language of the Computer — 1 Conditional Operations Branch to a labeled instruction if a condition is true – Otherwise, continue.
Addressing Modes. Register Addressing Immediate Addressing Base Addressing Indexed Addressing PC-Relative Addressing.
Arrays in MIPS Assembly Computer Organization and Assembly Language: Module 6.
Computer Organization Instructions Language of The Computer (MIPS) 2.
1 ENERGY 211 / CME 211 Lecture 4 September 29, 2008.
Control Structures Computer Organization I 1 October 2009 © McQuain, Feng & Ribbens Conditional Control Structure if ( i < j ) goto A; else.
CSCI-365 Computer Organization Lecture Note: Some slides and/or pictures in the following are adapted from: Computer Organization and Design, Patterson.
Computer Organization and Design Pointers, Arrays and Strings in C
MIPS Instruction Set Advantages
CSCI206 - Computer Organization & Programming
CS2100 Computer Organisation
Lecture 4: MIPS Instruction Set
RISC Concepts, MIPS ISA Logic Design Tutorial 8.
Clear1 and Clear2 clear1(int array[], int size) { int i; for (i = 0; i < size; i += 1) array[i] = 0; } clear2(int *array, int size) {
Instructions - Type and Format
Lecture 4: MIPS Instruction Set
CSCI206 - Computer Organization & Programming
Computer Organization and Design Addressing Modes
These are slides from Comp411
ECE232: Hardware Organization and Design
Operands and Addressing Modes
October 1 Programming Questions?
September 5 Fang-Yi’s Office Hours Friday 10am  12pm (and another TBD) Programming Language Issues (JAVA vs. C, Pointers vs. Arrays) Representations Instructions.
The University of Adelaide, School of Computer Science
Computer Organization and Design Assembly & Compilation
3.
COMS 361 Computer Organization
COMS 361 Computer Organization
Addressing Modes Don Porter.
Computer Organization and Design Addressing Modes
Operands and Addressing Modes
9/27: Lecture Topics Memory Data transfer instructions
August 31 addresses Drop box Questions? 31 August 2004
Conditional Branching (beq)
Presentation transcript:

Computer Organization and Design Addressing Modes Montek Singh Wed, Sep 19, 2012 Lecture 6

Operands and Addressing Modes Where is the data? Addresses as data Names and Values Indirection Reading: Ch. 2.3, 2.14

C vs. Java  For our purposes C is almost identical to Java except: C has “functions”, JAVA has “methods” C has “functions”, JAVA has “methods”  function == method without “class”  i.e., a global method C has “pointers” explicitly C has “pointers” explicitly  Java has them (called “references”) but hides them under the covers  JVM takes care of handling pointers, so the programmer doesn’t have to  C++ is sort of in-between C and Java  In this class, we will see how pointers/references are implemented at the assembly language level

What is a “pointer” in C?  A pointer is an explicit memory address  Example int i int i  i is an integer variable  located at, say, address 1056 int *p int *p  p is a variable that “points to” an integer  p is located at, say, address 2004 p = &i p = &i  the value in p is now equal to the address of variable i  i.e., the value stored in Mem[2004] is 1056 (the location of i ) 1056 i p Memory address

Referencing and Dereferencing  Referencing an object means … taking its address and assigning it to a pointer variable (e.g., &i ) … taking its address and assigning it to a pointer variable (e.g., &i )  Dereferencing a pointer means … going to the memory address pointed to by the pointer, and accessing the value there (e.g., *p ) … going to the memory address pointed to by the pointer, and accessing the value there (e.g., *p )  Example int i;// i is an int variable int *p;// p is a pointer to int p = &i; // referencing i // p is assigned 1056 *p = 5; // dereference p // i assigned i p Memory address

Pointer expressions and arrays  Dereferencing could be done to an expression So, not just *p, but can also write *(p+400) So, not just *p, but can also write *(p+400)  accesses memory location that is 400th int after i  Arrays in C are really pointers underneath! int a[10];// array of integers int a[10];// array of integers a itself simply refers to the address of the start of the array a itself simply refers to the address of the start of the array a is the same as &a[0] a is the same as &a[0] a is a constant of type “ int * ” a is a constant of type “ int * ” a[0] is the same as *a a[0] is the same as *a a[1] is the same as *(a+1) a[1] is the same as *(a+1) a[k] is the same as *(a+k) a[k] is the same as *(a+k) a[j] = a[k]; is the same as *(a+j) = *(a+k); a[j] = a[k]; is the same as *(a+j) = *(a+k);

Pointer arithmetic and object size  IMPORTANT: Pointer expressions automatically account for the size of object pointed to Example 1 Example 1  if p is of type “int *”  and an int is 4 bytes long  if p points to address 1056, (p=p+2) will point to address 1064  C compiler automatically does the multiply-by-4  BUT… in assembly, the programmer will have to explicitly do the multiply-by-4 Example 2 Example 2  char *q;  q++; // really does add i p Memory address

Pointer examples int i;// simple integer variable int a[10];// array of integers int *p;// pointer to integer p = &i;// & means address of p = a;// a means &a[0] p = &a[5];// address of 6 th element of a *p// value at location pointed by p *p = 1;// change value at that location *(p+1) = 1;// change value at next location p[1] = 1;// exactly the same as above p++;// step pointer to the next element

Pointer pitfalls int i;// simple integer variable int a[10];// array of integers int *p;// pointer to integer(s) So what happens when p = &i; What is value of p[0]? What is value of p[1]?  Very easy to exceed bounds (C has no bounds checking)

Iterating through an array  2 ways to iterate through an array using array indices using array indices void clear1(int array[], int size) { for(int i=0; i<size; i++) for(int i=0; i<size; i++) array[i] = 0; array[i] = 0;} using pointers using pointers void clear2(int *array, int size) { for(int *p = &array[0]; p < &array[size]; p++) for(int *p = &array[0]; p < &array[size]; p++) *p = 0; *p = 0;} or, also using pointers, but more concise (more cryptic!) or, also using pointers, but more concise (more cryptic!) void clear3(int *array, int size) { int *arrayend = array + size; int *arrayend = array + size; while(array < arrayend) *array++ = 0; while(array < arrayend) *array++ = 0;}

Pointer summary  In the “C” world and in the “machine” world: a pointer is just the address of an object in memory a pointer is just the address of an object in memory size of pointer itself is fixed regardless of size of object size of pointer itself is fixed regardless of size of object to get to the next object: to get to the next object:  in machine code: increment pointer by the object’s size in bytes  in C: increment pointer by 1 to get the ith object: to get the ith object:  in machine code: add i*sizeof(object) to pointer  in C: add i to pointer  Examples: int R[5]; // 20 bytes storage int R[5]; // 20 bytes storage R[i] is same as *(R+i) R[i] is same as *(R+i) int *p = &R[3] is same as p = (R+3) (p points 12 bytes after start of R) int *p = &R[3] is same as p = (R+3) (p points 12 bytes after start of R)

Addressing Modes What are all the different ways to specify an operand?

Revisiting Operands  Operands = the variables needed to perform an instruction’s operation  Three types in the MIPS ISA: Register: Register: add $2, $3, $4# operands are the “contents” of a register Immediate: Immediate: addi $2,$2,1# 2nd source operand is part of the instruction Register-Indirect: Register-Indirect: lw $2, 12($28)# source operand is in memory sw $2, 12($28)# destination operand is memory  Simple enough, but is it enough?

MIPS can do these with appropriate choices for Ra and const Common “Addressing Modes” Absolute (Direct): lw $8, 0x1000($0) –Value = Mem[constant] –Use: accessing static data Indirect: lw $8, 0($9) –Value = Mem[Reg[x]] –Use: pointer accesses Displacement: lw $8, 16($9) –Value = Mem[Reg[x] + constant] –Use: access to local variables Indexed: –Value = Mem[Reg[x] + Reg[y]] –Use: array accesses (base+index) Memory indirect: –Value = Mem[Mem[Reg[x]]] –Use: access thru pointer in mem Autoincrement: –Value = Mem[Reg[x]]; Reg[x]++ –Use: sequential pointer accesses Autodecrement: –Value = Reg[X]--; Mem[Reg[x]] –Use: stack operations Scaled: –Value = Mem[Reg[x] + c + d*Reg[y]] –Use: array accesses (base+index) Is the complexity worth the cost? Need a cost/benefit analysis!

Relative popularity of address modes From Hennessy & Patterson

Absolute (Direct) Addressing  What we want: Contents of a specific memory location, i.e. at a given address Contents of a specific memory location, i.e. at a given address  Example:  Caveats In practice $gp is used instead of $0 In practice $gp is used instead of $0 Can only address the first and last 32K of memory this way Can only address the first and last 32K of memory this way Sometimes generates a two instruction sequence: Sometimes generates a two instruction sequence: “C” int x = 10; main() { x = x + 1; } “MIPS Assembly”.data.global x x:.word 10.text.global main main: lw $2,x($0) addi $2,$2,1 sw $2,x($0) lui $1,xhighbits lw $2,xlowbits($1) Allocates space for a single integer (4- bytes) and initializes its value to 10

Absolute (Direct) Addressing: More detail “C” int x = 10; main() { x = x + 1; } “MIPS Assembly”.data.global x x:.word 10.text.global main main: lw $2,x($0) addi $2,$2,1 sw $2,x($0) “After Compilation”.data 0x0100.global x x:.word 10.text.global main main: lw $2,0x100($0) addi $2,$2,1 sw $2,0x100($0)  Assembler replaces “ x ” by its address e.g., here the data part of the code (.data ) starts at 0x100 e.g., here the data part of the code (.data ) starts at 0x100 x is the first variable, so starts at 0x100 x is the first variable, so starts at 0x100

Indirect Addressing  What we want: The contents at a memory address held in a register The contents at a memory address held in a register  Examples:  Caveats You must make sure that the register contains a valid address (double, word, or short aligned as required) You must make sure that the register contains a valid address (double, word, or short aligned as required) “C” int x = 10; main() { int *y = &x; *y = 2; } “MIPS Assembly”.data.global x x:.word 10.text.global main main: la $2,x addi $3,$0,2 sw $3,0($2) lui $2,xhighbits ori $2,$2,xlowbits “la” is not a real instruction, It’s a convenient pseudoinstruction that constructs a constant via either a 1 instruction or 2 instruction sequence ori $2,$0,x

Note on la pseudoinstruction  la is a pseudoinstruction: la $r, x stands for “load the address of” variable x into register r stands for “load the address of” variable x into register r not an actual MIPS instruction not an actual MIPS instruction but broken down by the assembler into actual instructions but broken down by the assembler into actual instructions  if address of x is small (fits within 16 bits), then a single ori  if address of x is larger, use the lui + ori combo “MIPS Assembly”.data.global x x:.word 10.text.global main main: la $2,x addi $3,$0,2 sw $3,0($2) lui $2,0x8000 ori $2,$2,0x0010 ori $2,$0,0x100 0x01000x

Displacement Addressing  What we want: contents of a memory location at an offset relative to a register contents of a memory location at an offset relative to a register  the address that is the sum of a constant and a register value  Examples:  Caveats Must multiply (shift) the “index” to be properly aligned Must multiply (shift) the “index” to be properly aligned “C” int a[5]; main() { int i = 3; a[i] = 2; } “MIPS Assembly”.data 0x0100.global a a:.space 20.text.global main main: addi $2,$0,3 // i in $2 addi $3,$0,2 sll $1,$2,2 // i*4 in $1 sw $3,a($1) Allocates space for a 5 uninitialized integers (20- bytes)

Displacement Addressing: 2 nd example  What we want: The contents of a memory location relative to a register The contents of a memory location relative to a register  Examples:  Note offsets to the various fields within a structure are constants known to the assembler/compiler offsets to the various fields within a structure are constants known to the assembler/compiler “C” struct p { int x, y; } main() { p.x = 3; p.y = 2; } “MIPS Assembly”.data.global p p:.space 8.text.global main main: la $1,p addi $2,$0,3 sw $2,0($1) addi $2,$0,2 sw $2,4($1) Allocates space for 2 uninitialized integers (8-bytes)

Assembly Coding Templates For common C program fragments

Conditionals: if-else C code: if (expr) { STUFF1 } else { STUFF2 } MIPS assembly: (compute expr in $rx) beq $rx, $0, Lelse (compile STUFF1) beq $0, $0, Lendif Lelse: (compile STUFF2) Lendif: C code: if (expr) { STUFF } MIPS assembly: (compute expr in $rx) beq $rx, $0, Lendif (compile STUFF) Lendif: There are little tricks that come into play when compiling conditional code blocks. For instance, the statement: if (y > 32) { x = x + 1; } compiles to: lw $24, y ori $15, $0, 32 slt $1, $15, $24 beq $1, $0, Lendif lw $24, x addi $24, $24, 1 sw $24, x Lendif:

Loops: while MIPS assembly: Lwhile: (compute expr in $rx) beq $rX,$0,Lendw (compile STUFF) beq $0,$0,Lwhile Lendw: C code: while (expr) { STUFF } Alternate MIPS assembly: beq $0,$0,Ltest Lwhile: (compile STUFF) Ltest: (compute expr in $rx) bne $rX,$0,Lwhile Lendw: Compilers spend a lot of time optimizing in and around loops - moving all possible computations outside of loops - unrolling loops to reduce branching overhead - simplifying expressions that depend on “loop variables”

Loops: for  Most high-level languages provide loop constructs that establish and update an iteration variable, which is used to control the loop’s behavior MIPS assembly: sum:.word 0x0 data:.word 0x1, 0x2, 0x3, 0x4, 0x5.word 0x6, 0x7, 0x8, 0x9, 0xa add $30,$0,$0 Lfor: lw $24,sum($0) sll $15,$30,2 lw $15,data($15) addu $24,$24,$15 sw $24,sum add $30,$30,1 slt $24,$30,10 bne $24,$0,Lfor Lendfor: C code: int sum = 0; int data[10] = {1,2,3,4,5,6,7,8,9,10}; int i; for (i=0; i<10; i++) { sum += data[i] }

Next Class  We’ll write some real assembly code  Play with a simulator