CMU Computer Systems: Machine-Level Programming (Procedures)

177 阅读2分钟

Mechanisms in Procedures

  • Passing control

    • To beggining of procedure code
    • Back to return point
  • Passing data

    • Procedure arguments
    • Return value
  • Memory management

    • Allocate during procedure execution
    • Deallocate upon return
  • Mechanisms all implemented with machine instructions

  • x86-64 implemention of a procedure uses only those mechanisms required

Procedures

  • Stack Structure

  • Calling Conventions

    • Passing control
    • Passing data
    • Managing local data
  • Illustration of Recursion

x86-64 Stack

  • Region of memory managed with stack discipline

  • Grows toward lower address

  • Register %rsp contains lowest stack address

    • address of “top” element
  • Operation: Push and Pop

Procedure Control Flow

  • Use stack to support procedure call and return

  • Procedure call: call label

    • Push return address on stack
    • Jump to label
  • Return address:

    • Address of the next instruction right after call
    • Example from disassembly
  • Procedure return: ret

    • Pop address from stack
    • Jump to address

Procedure Data Flow (ABI rule)

  • Registers

    • First 6 arguments: %rdi %rsi %rdx %rcx %r8 %r9
  • Return value: %rax

  • Only allocate stack space when needed

Stack-Based Languages

  • Languages that support recursion

    • C, Pascal, Java

    • Code must be “Reentrant”

      • Multiple simultaneous instantiations of single procedure
    • Need some place to store state of each instantiation

      • Arguments
      • Local variables
      • Return pointer
  • Stack discipline

    • State for given procedure needed for limited time

      • From when called to when return
    • Callee returns before caller does

  • Stack allocated in Frames

    • state for single procedure instantiation

Stack Frames

  • Contents

    • Return information
    • Local storage (if needed)
    • Temporary space (if needed)
  • Management

    • Space allocated when enter procedure

      • “Set-up” code
      • Includes push by call instruction
    • Deallocated when return

      • “Finish” code
      • Includes pop by ret instruction

Register Saving Conventions

  • “Caller Saved”

    • Caller saves temporary values in its frame before the call
  • “Callee Saved”

    • Callee saves temporary values in its frame before using
    • Callee restores them before returning to caller

x86-64 Linux Register Usage

  • %rax

    • Return value
    • Also caller-saved
    • Can be modified by procedure
  • %rdi, …, %r9

    • Arguments
    • Also caller-saved
    • Can be modified by procedure
  • %r10, %r11

    • Caller-saved
    • Can be modified by procedure
  • %rbx, %r12, %r13, %r14

    • Callee-saved
    • Callee must save & restore
  • %rbp

    • Callee-saved
    • Callee must save & restore
    • May be used as frame pointer
    • Can mix & match
  • %rsp

    • Special form of callee save
    • Restored to original value upon exit from procedure

Observations About Recursion

  • Handled Without Special Consideration

    • Stack frames mean that each function call has private storage

      • Saved registers & local variables
      • Saved return pointer
    • Register saving conventions prevent one function call from corrupting another’s call

      • Unless the C code explicitly does so
    • Stack discipline follows call/ return pattern

  • Also works for mutual recursion

    • P calls Q; Q calls P

x86-64 Procedure Summary

  • Important Points

    • Stack is the right data structure for procedure call/ return

      • If P calls Q, then Q returns before P
  • Recursion (& mutual recursion) handled by normal calling conventions

    • Can safely store values in local stack frame and in callee-saved registers
    • Put function arguments at top of stack
    • Result return in %rax
  • Pointers are addresses of values

    • On stack or global