normal c memory management °a program’s address space contains 4 regions: stack: local variables,...

39
Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via malloc() ; resizes dynamically, grows upward static data: variables declared outside main, does not grow or shrink code static data heap stack OS someprevents accesses between stack and heap (gray hash lines). ~ FFFF FFFF hex ~ 0 hex

Post on 20-Dec-2015

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Normal C Memory Management°A program’s address

space contains 4 regions:• stack: local variables, grows downward

• heap: space requested for pointers via malloc() ; resizes dynamically, grows upward

• static data: variables declared outside main, does not grow or shrink

• code: loaded when program starts, does not change

code

static data

heap

stack

OS someprevents accesses between stack and heap (gray hash lines).

~ FFFF FFFFhex

~ 0hex

Page 2: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Intel 80x86 C Memory Management°A C program’s 80x86

address space :• heap: space requested for pointers via malloc(); resizes dynamically, grows upward

• static data: variables declared outside main, does not grow or shrink

• code: loaded when program starts, does not change

• stack: local variables, grows downward

code

static data

heap

stack~ 08000000hex

Page 3: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Overview

°C operators, operands

°Variables in Assembly: Registers

°Comments in Assembly

°Addition and Subtraction in Assembly

°Memory Access in Assembly

Page 4: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Assembly Language°Basic job of a CPU: execute lots of instructions.

° Instructions are the primitive operations that the CPU may execute.

°Different CPUs implement different sets of instructions. The set of instructions a particular CPU implements is an Instruction Set Architecture (ISA).

• Examples: Intel 80x86 (Pentium 4), IBM/Motorola PowerPC (Macintosh), MIPS, Intel IA64, ...

Page 5: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Instruction Set Architectures°Early trend was to add more and more instructions to new CPUs to do elaborate operations

• VAX architecture had an instruction to multiply polynomials!

°RISC philosophy (Cocke IBM, Patterson, Hennessy, 1980s) – Reduced Instruction Set Computing

• Keep the instruction set small and simple, makes it easier to build fast hardware.

• Let software do complicated operations by composing simpler ones.

Page 6: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

MIPS Architecture°MIPS – semiconductor company

that built one of the first commercial RISC architectures

°We will study the MIPS architecture in some detail in this class

°Why MIPS instead of Intel 80x86?• MIPS is simple, elegant. Don’t want to get bogged down in gritty details.

• MIPS widely used in embedded apps, x86 little used in embedded, and more embedded computers than PCs

Page 7: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Assembly Variables: Registers°Unlike HLL like C or Java, assembly cannot use variables

• Why not? Keep Hardware Simple

°Assembly Operands are registers• limited number of special locations built directly into the hardware

• operations can only be performed on these!

°Benefit: Since registers are directly in hardware, they are very fast (faster than 1 billionth of a second)

Page 8: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Assembly Variables: Registers (2/4)°Drawback: Since registers are in hardware, there are a predetermined number of them

• Solution: MIPS code must be very carefully put together to efficiently use registers

°32 registers in MIPS• Why 32? Smaller is faster

°Each MIPS register is 32 bits wide• Groups of 32 bits called a word in MIPS

Page 9: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Assembly Variables: Registers (3/4)°Registers are numbered from 0 to 31

°Each register can be referred to by number or name

°Number references:$0, $1, $2, … $30, $31

Page 10: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Assembly Variables: Registers (4/4)°By convention, each register also has a name to make it easier to code

°For now:$16 - $23 $s0 - $s7

(correspond to C variables)

$8 - $15 $t0 - $t7

(correspond to temporary variables)

Later will explain other 16 register names

° In general, use names to make your code more readable

Page 11: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

C, Java variables vs. registers° In C (and most High Level Languages) variables declared first and given a type

• Example: int fahr, celsius; char a, b, c, d, e;

°Each variable can ONLY represent a value of the type it was declared as (cannot mix and match int and char variables).

° In Assembly Language, the registers have no type; operation determines how register contents are treated

Page 12: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Comments in Assembly°Another way to make your code more readable: comments!

°Hash (#) is used for MIPS comments• anything from hash mark to end of line is a comment and will be ignored

°Note: Different from C.• C comments have format /* comment */ , so they can span many lines

Page 13: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Assembly Instructions° In assembly language, each statement (called an Instruction), executes exactly one of a short list of simple commands

°Unlike in C (and most other High Level Languages), each line of assembly code contains at most 1 instruction

° Instructions are related to operations (=, +, -, *, /) in C or Java

Page 14: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

MIPS Addition and Subtraction (1/4)°Syntax of Instructions:

1 2,3,4

where:

1) operation by name

2) operand getting result (“destination”)

3) 1st operand for operation (“source1”)

4) 2nd operand for operation (“source2”)

°Syntax is rigid:• 1 operator, 3 operands

• Why? Keep Hardware simple via regularity

Page 15: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Addition and Subtraction of Integers (2/4)°Addition in Assembly

• Example: add $s0,$s1,$s2 (in MIPS)

Equivalent to: a = b + c (in C)

where MIPS registers $s0,$s1,$s2 are associated with C variables a, b, c

°Subtraction in Assembly• Example: sub $s3,$s4,$s5 (in MIPS)

Equivalent to: d = e - f (in C)

where MIPS registers $s3,$s4,$s5 are associated with C variables d, e, f

Page 16: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Addition and Subtraction of Integers (3/4)°How do the following C statement?

a = b + c + d - e;

°Break into multiple instructionsadd $t0, $s1, $s2 # temp = b + c

add $t0, $t0, $s3 # temp = temp + d

sub $s0, $t0, $s4 # a = temp - e

°Notice: A single line of C may break up into several lines of MIPS.

°Notice: Everything after the hash mark on each line is ignored (comments)

Page 17: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Addition and Subtraction of Integers (4/4)°How do we do this?

f = (g + h) - (i + j);

°Use intermediate temporary registeradd $t0,$s1,$s2 # temp = g + h

add $t1,$s3,$s4 # temp = i + j

sub $s0,$t0,$t1 # f=(g+h)-(i+j)

Page 18: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Register Zero°One particular immediate, the number

zero (0), appears very often in code.

°So we define register zero ($0 or $zero) to always have the value 0; egadd $s0,$s1,$zero (in MIPS)

f = g (in C)

where MIPS registers $s0,$s1 are associated with C variables f, g

°defined in hardware, so an instruction addi $zero,$zero,5

will not do anything!

Page 19: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Immediates

° Immediates are numerical constants.

°They appear often in code, so there are special instructions for them.

°Add Immediate:addi $s0,$s1,10 (in MIPS)

f = g + 10 (in C)

where MIPS registers $s0,$s1 are associated with C variables f, g

°Syntax similar to add instruction, except that last argument is a number instead of a register.

Page 20: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Immediates

°There is no Subtract Immediate in MIPS: Why?

°Limit types of operations that can be done to absolute minimum

• if an operation can be decomposed into a simpler operation, don’t include it

• addi …, -X = subi …, X => so no subi

° addi $s0,$s1,-10 (in MIPS)f = g - 10 (in C)

where MIPS registers $s0,$s1 are associated with C variables f, g

Page 21: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Assembly Operands: Memory°C variables map onto registers; what about large data structures like arrays?

°1 of 5 components of a computer: memory contains such data structures

°But MIPS arithmetic instructions only operate on registers, never directly on memory.

°Data transfer instructions transfer data between registers and memory:

• Memory to register

• Register to memory

Page 22: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Anatomy: 5 components of any Computer

Personal Computer

Processor

Computer

Control(“brain”)

DatapathRegisters

Memory Devices

Input

OutputLoadLoad

StoreStore

These are “data transfer” instructions

Registers are in the datapath of the processor; if operands are in memory, we must transfer them to the processor to operate on them,And then transfer back to memory when done

Page 23: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Data Transfer: Memory to Reg (1/4)°To transfer a word of data, we need to specify two things:

• Register: specify this by number (0 - 31) or symbolic name ($s0,…, $t0, …)

• Memory address: more difficult

- Think of memory as a single one-dimensional array, so we can address it simply by supplying a pointer to a memory address.

- Other times, we want to be able to offset from this pointer.

Page 24: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Data Transfer: Memory to Reg (2/4)°To specify a memory address to copy from, specify two things:

• A register which contains a pointer to memory

• A numerical offset (in bytes)

°The desired memory address is the sum of these two values.

°Example:8($t0)• specifies the memory address pointed to by the value in $t0, plus 8 bytes

Page 25: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Data Transfer: Memory to Reg (3/4)°Load Instruction Syntax:

1 2,3(4)

• where

1) operation name

2) register that will receive value

3) numerical offset in bytes

4) register containing pointer to memory

°MIPS Instruction Name:•lw (meaning Load Word, so 32 bits or one word are loaded at a time)

Page 26: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Data Transfer: Memory to Reg (4/4)°Example:lw $t0,12($s0)

This instruction will take the pointer in $s0, add 12 bytes to it, and then load the value from the memory pointed to by this calculated sum into register $t0

°Notes:•$s0 is called the base register

• 12 is called the offset

• offset is generally used in accessing elements of array or structure: base reg points to beginning of array or structure

Page 27: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Data Transfer: Reg to Memory (1/2)°Also want to store value from a register into memory

°Store instruction syntax is identical to Load instruction syntax

°MIPS Instruction Name:

sw (meaning Store Word, so 32 bits or one word are loaded at a

time)

Page 28: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Data Transfer: Reg to Memory (2/2)°Example:sw $t0,12($s0)

This instruction will take the pointer in $s0, add 12 bytes to it, and then store the value from register $t0 into the memory address pointed to by the calculated sum

Page 29: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Pointers v. Values°Key Concept: A register can hold any 32-bit value. That value can be a (signed) int, an unsigned int, a pointer (memory address), and so on

° If you write add $t2,$t1,$t0then $t0 and $t1 better contain values

° If you write lw $t2,0($t0)then $t0 better contain a pointer

°Don’t mix these up!

Page 30: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Question° “Some people do not understand the

distinction between x = y and *x = *y”Assume x is associated with register $s0, y with $s1Here are 6 MIPS instructions, labeled L1 to L6:

L1: add $s0, $s1, $zeroL2: add $s1, $s0, $zeroL3: lw $s0, 0($s1)

° Which is true? (“L4; L5” means L4 then L5)A red: Line 1 is x = y; L6 is *x = *y B yellow: Line 2 is x = y; L3 is *x = *y C green: L4; L5 is x = y; L3 is *x = *y D blue: Line 2 is x = y; L4 is *x = *y

E indigo: Line 2 is x = y; L4; L5 is *x = *y F white: Line 1 is x = y; L4; L5 is *x = *y

L4: lw $t0, 0($s1)L5: sw $t0, 0($s0)L6: sw $s0, 0($s1)

Page 31: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Question° “Some people do not understand the

distinction between x = y and *x = *y”Assume x is associated with register $s0, y with $s1Here are 6 MIPS instructions, labeled L1 to L6:

L1: add $s0, $s1, zeroL2: add $s1, $s0, zeroL3: lw $s0, 0($s1)

° Which is true? (“L4; L5” means L4 then L5)A red: Line 1 is x = y; L6 is *x = *y B yellow: Line 2 is x = y; L3 is *x = *y C green: L4; L5 is x = y; L3 is *x = *y D blue: Line 2 is x = y; L4 is *x = *y

E indigo: Line 2 is x = y; L4; L5 is *x = *y F white: Line 1 is x = y; L4; L5 is *x = *y

L4: lw $t0, 0($s1)L5: sw $t0, 0($s0)L6: sw $s0, 0($s1)

Page 32: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Addressing: Byte vs. word°Every word in memory has an address, similar to an index in an array

°Early computers numbered words like C numbers elements of an array:•Memory[0], Memory[1], Memory[2], …

Called the “address” of a word

°Computers needed to access 8-bit bytes as well as words (4 bytes/word)

°Today machines address memory as bytes, hence 32-bit (4 byte) word addresses differ by 4•Memory[0], Memory[4], Memory[8], …

Page 33: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Compilation with Memory°What offset in lw to select A[8] in C?

° 4x8=32 to select A[8]: byte v. word

°Compile by hand using registers:g = h + A[8];

• g: $s1, h: $s2, $s3:base address of A

°1st transfer from memory to register:

lw $t0,32($s3) # $t0 gets A[8]• Add 32 to $s3 to select A[8], put into $t0

°Next add it to h and place in gadd $s1,$s2,$t0 # $s1 = h+A[8]

Page 34: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Notes about Memory°Pitfall: Forgetting that sequential word addresses in machines with byte addressing do not differ by 1.

• Many an assembly language programmer has toiled over errors made by assuming that the address of the next word can be found by incrementing the address in a register by 1 instead of by the word size in bytes.

• So remember that for both lw and sw, the sum of the base address and the offset must be a multiple of 4 (to be word aligned)

Page 35: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

More Notes about Memory: Alignment

0 1 2 3

Aligned

NotAligned

°MIPS requires that all words start at addresses that are multiples of 4 bytes

°Called Alignment: objects must fall on address that is multiple of their size.

Page 36: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Role of Registers vs. Memory°What if more variables than registers?

• Compiler tries to keep most frequently used variable in registers

• Less common in memory: spilling

°Why not keep all variables in memory?• Smaller is faster:registers are faster than memory

• Registers more versatile: - MIPS arithmetic instructions can read 2,

operate on them, and write 1 per instruction

- MIPS data transfer only read or write 1 operand per instruction, and no operation

Page 37: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

Question° C vs. MIPS: Which statements are false?1. Assignment Statements: one variable on left hand side in C, one variable (register) is destination in MIPS

2. Assignment Statements: any number of variables on right hand side in C, 1 or 2 (registers) source in MIPS

3. Comments: /* ... */ in C, # to end of line in MIPS

4. Variables: declared in C, no declaration in MIPS

5. Types: associated with declaration in C (normally), associated with instruction (operator) in MIPS

A red: Statement 1 is false, rest are true B yellow: Statement 2 is false, rest are true C green: Statement 3 is false, rest are true D blue: Statement 4 is false, rest are true

E indigo: Statement 5 is false, rest are true F white: None are false, all are true

Page 38: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

“And in Conclusion…” (1/2)

° In MIPS Assembly Language:• Registers replace C variables

• One Instruction (simple operation) per line

• Simpler is Better

• Smaller is Faster

°Memory is byte-addressable, but lw and sw access one word at a time.

°A pointer (used by lw and sw) is just a memory address, so we can add to it or subtract from it (using offset).

Page 39: Normal C Memory Management °A program’s address space contains 4 regions: stack: local variables, grows downward heap: space requested for pointers via

“And in Conclusion…”(2/2)°New Instructions:

add, addi,

sub

lw, sw

°New Registers:C Variables: $s0 - $s7

Temporary Variables: $t0 - $t9

Zero: $zero