Chapter 8 Evaluating the Instruction Set Architecture of H1: Part 2.

Slides:



Advertisements
Similar presentations
Programming Languages and Paradigms
Advertisements

Chapter 9 Pointers and Dynamic Arrays. Overview 9.1 Pointers 9.2 Dynamic Arrays.
Computer Architecture CSCE 350
Functions Functions and Parameters. History A function call needs to save the registers in use The called function will use the registers The registers.
The Assembly Language Level
Assembler Parameter Passing Exercises. Assembler Exercise 1: Convert the following C++ code to H1 assembler. int foo(int a, char ch = ‘a’) { if ch ==
Chapter 7: User-Defined Functions II Instructor: Mohammad Mojaddam.
Kernighan/Ritchie: Kelley/Pohl:
1 Pointers A pointer variable holds an address We may add or subtract an integer to get a different address. Adding an integer k to a pointer p with base.
Bitwise Operators Pointers Functions Structs Interrupts (in C)
6/10/2015C++ for Java Programmers1 Pointers and References Timothy Budd.
Chapter 9. 2 Objectives You should be able to describe: Addresses and Pointers Array Names as Pointers Pointer Arithmetic Passing Addresses Common Programming.
1 Storage Registers vs. memory Access to registers is much faster than access to memory Goal: store as much data as possible in registers Limitations/considerations:
1 Chapter 7: Runtime Environments. int * larger (int a, int b) { if (a > b) return &a; //wrong else return &b; //wrong } int * larger (int *a, int *b)
Pointers. Topics Pointers Pointer Arithmetic Pointers and Arrays.
Run time vs. Compile time
Copyright © 2008 Pearson Addison-Wesley. All rights reserved. Chapter 9 Pointers and Dynamic Arrays.
Overview C programming Environment C Global Variables C Local Variables Memory Map for a C Function C Activation Records Example Compilation.
Chapter 6. 2 Objectives You should be able to describe: Function and Parameter Declarations Returning a Single Value Pass by Reference Variable Scope.
Chapter 4 H1 Assembly Language: Part 2. Direct instruction Contains the absolute address of the memory location it accesses. ld instruction:
1 Pointers, Dynamic Data, and Reference Types Review on Pointers Reference Variables Dynamic Memory Allocation –The new operator –The delete operator –Dynamic.
C Programming for Embedded Systems. fig_06_00 Computer Layers Low-level hardware to high-level software (4GL: “domain-specific”, report-driven, e.g.)
Data Types.
Macro & Function. Function consumes more time When a function is called, the copy of the arguments are passed to the parameters in the function. After.
1 CISC181 Introduction to Computer Science Dr. McCoy Lecture 19 Clicker Questions November 3, 2009.
C++ Programming: Program Design Including Data Structures, Fourth Edition Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes.
C++ Programming: From Problem Analysis to Program Design, Fourth Edition Chapter 14: Pointers, Classes, Virtual Functions, and Abstract Classes.
Chapter 7 Evaluating the Instruction Set Architecture of H1: Part 1.
IT253: Computer Organization Lecture 4: Instruction Set Architecture Tonga Institute of Higher Education.
CSC3315 (Spring 2009)1 CSC 3315 Programming Languages Hamid Harroud School of Science and Engineering, Akhawayn University
A First Book of C++: From Here To There, Third Edition2 Objectives You should be able to describe: Function and Parameter Declarations Returning a Single.
DEPARTMENT OF COMPUTER SCIENCE & TECHNOLOGY FACULTY OF SCIENCE & TECHNOLOGY UNIVERSITY OF UWA WELLASSA 1 CST 221 OBJECT ORIENTED PROGRAMMING(OOP) ( 2 CREDITS.
Recursion Textbook chapter Recursive Function Call a recursive call is a function call in which the called function is the same as the one making.
C++ Programming: From Problem Analysis to Program Design, Fifth Edition, Fifth Edition Chapter 7: User-Defined Functions II.
Overloading Binary Operators Two ways to overload –As a member function of a class –As a friend function As member functions –General syntax Data Structures.
CPSC 388 – Compiler Design and Construction Runtime Environments.
Copyright © 2005 Elsevier Chapter 8 :: Subroutines and Control Abstraction Programming Language Pragmatics Michael L. Scott.
Hello.java Program Output 1 public class Hello { 2 public static void main( String [] args ) 3 { 4 System.out.println( “Hello!" ); 5 } // end method main.
Pointers. What is pointer l Everything stored in a computer program has a memory address. This is especially true of variables. char c=‘y’; int i=2; According.
Pointers: Basics. 2 What is a pointer? First of all, it is a variable, just like other variables you studied  So it has type, storage etc. Difference:
Implementing Subprograms What actions must take place when subprograms are called and when they terminate? –calling a subprogram has several associated.
Lecture 3 Classes, Structs, Enums Passing by reference and value Arrays.
Slides created by: Professor Ian G. Harris Hello World #include main() { printf(“Hello, world.\n”); }  #include is a compiler directive to include (concatenate)
Pointers *, &, array similarities, functions, sizeof.
Computer Organization and Design Pointers, Arrays and Strings in C Montek Singh Sep 18, 2015 Lab 5 supplement.
Types of C Variables:  The following are some types of C variables on the basis of constants values it has. For example: ○ An integer variable can hold.
C++ Programming: From Problem Analysis to Program Design, Third Edition Chapter 14: Pointers.
CS415 C++ Programming Takamitsu Kawai x4212 G11 CERC building WV Virtual Environments Lab West Virginia University.
12/23/2015Engineering Problem Solving with C++, second edition, J. Ingber 1 Engineering Problem Solving with C++, Etter/Ingber Chapter 9 An Introduction.
1 Lecture 7: MARS, Computer Arithmetic Today’s topics:  MARS intro  Numerical representations  Addition and subtraction.
Functions Math library functions Function definition Function invocation Argument passing Scope of an variable Programming 1 DCT 1033.
ICOM 4035 – Data Structures Dr. Manuel Rodríguez Martínez Electrical and Computer Engineering Department Lecture 2 – August 23, 2001.
EEL 3801 C++ as an Enhancement of C. EEL 3801 – Lotzi Bölöni Comments  Can be done with // at the start of the commented line.  The end-of-line terminates.
Pointers1 WHAT IS A POINTER? Simply stated, a pointer is an address. A running program consists of three parts: execution stack, code, and data. They are.
Copyright © 2014 Pearson Addison-Wesley. All rights reserved. Chapter 9 Pointers and Dynamic Arrays.
A FIRST BOOK OF C++ CHAPTER 8 ARRAYS AND POINTERS.
C++ for Engineers and Scientists Second Edition Chapter 12 Pointers.
Object Lifetime and Pointers
Chapter 8 Exercises.
Computer Organization and Design Pointers, Arrays and Strings in C
User-Written Functions
Functions.
CS 326 Programming Languages, Concepts and Implementation
Introduction to Compilers Tim Teitelbaum
Chapter 7 Subroutines Dr. A.P. Preethy
Chapter 9 :: Subroutines and Control Abstraction
Pointer to a Structure & Structure Containing a Pointer Difference Lesson xx  In this presentation, we will illustrate the difference between a pointer.
Chap. 8 :: Subroutines and Control Abstraction
Chap. 8 :: Subroutines and Control Abstraction
Lecture 15 (Notes by P. N. Hilfinger and R. Bodik)
Presentation transcript:

Chapter 8 Evaluating the Instruction Set Architecture of H1: Part 2

An argument in call by reference can be &y. For example, y: 1 code f p: int y = 1; // pass the address of y to f void fr(int *p) { *p = *p + 5; // y = y + 5 } void main() { fr(&y); }

Parameter p points to y on entry into fr. y can be accessed by dereferencing p.

The special case of passing the address of an argument is referred to as call by address or call by reference. The program on the next slide contains both call by value and call by reference. fv uses call by value; fr uses call by reference; fvr uses both call by value and call by reference.

On entry into fv, the relative address of x is 1. x contains the value of y. On entry into fr, the relative address of p is 1. p points to y. See the next slide.

Relative address of p changes from 1 to 2 during the execution of fr because of the push.

Reference parameters Receives address of corresponding argument. Preceded by ‘&’ in the parameter list. Whenever a reference parameter is used in the called function, the address it contains is dereferenced.

void fr (int &z) // actual argument is address of apparent argument { z = z + 5; // actual argument is modified } void main() { fr(y); // address of y is passed, not value of y. } The address of y is passed because z is a reference parameter.

z is dereferenced wherever it is used because z is a reference parameter. void fr(int &z) { z = z + 5; // dereferencing is implicit }

Conceptual view of reference parameter mechanism The argument itself is passed, replacing the corresponding parameter wherever it appears in the called function. This is not what really happens, but it is easy to understand. C++ way of imitating Java syntax.

Comparing C++ and Java: class B {.. } void foo(B* p) { … } void bar (B& q) { … } int main() { B* b = new B() B b1; foo(b); bar(b1); C++ class B { …} class A { public void foo (B p) { …} public static void main() { B b = new B(); A a = new A(); a.foo(b); } Java In Java, everything is a reference so we don't need to distinguish between a ref parameter and a value parameter.

Line 7 becomes x = x + 5; on the 1 st call of fr. It becomes y = y + 5; on the second call.

An exception to the rule that whenever a reference parameter is used, the address it contains is dereferenced is illustrated by the program in the next slide. y is not dereferenced on line 12 because it is also the argument corresponding to the reference parameter z on line 5.

y not dereferenced here

1 2 3 x: dw 100 ; int x = 100; dw 5 dw 1 dw "x = " 7 8 fr: ldr 1 ; z = z load addr in ac 9 ldi ; switch addr and value 10 ; add 5 11 push ; push sum on to stack; 12 ldr 2 ; set up ac with addr 13 sti ; mem[ac] = mem[sp++] 14 ret 15

16 ft: ldr 1 ; y = y load addr in ac 17 ldi ; switch addr & value 18 ; add 1 19 push ; push sum on to stack 20 ldr 2 ; set up ac with addr 21 sti ; mem[ac] = mem[sp++] 22 ldr 1 ; function call arg to ac 23 push ; push to stack for call 24 call fr ; fr(y) 25 dloc 1 ; remove stack entry 26 ret 27 28

28 main: ldc x ; load function call arg to ac 29 push ; puch on to stack 30 call ft ; ft(x) 31 dloc sout 34 ld x 35 dout 36 ldc '\n' 37 aout 38 halt end main

Call by value vs Call by reference Call by value is a “one-way street”. Call by reference is a “two-way street”. Call by value duplicates the argument. It is time and space inefficient for large arguments. Call by reference passes only the address of the argument. Call by reference requires time-consuming dereferencing operations.

How does call by reference handle the following calls? fr2(x); fr2(200); fr2(x + y); For the 2 nd and 3 rd calls, the value of the argument is placed on the stack, and then the address of this value is passed (typically, on the stack).

100 sitting on top of stack top of stack address now new top of stack 100

Function overloading The use of the same name for more than one function. The functions with a common name must have parameter lists that differ in type, order, and/or number.

Implementing function overloading Function overloading is implemented by means of name mangling. With name mangling, each function name at the assembly level has a mangled name. The mangled name includes an encoding of the parameter list. Thus, functions with the same name but different parameter lists will have distinct names at the assembly level.

The assembly-level names for void fol() {…} void fol(int n) {…} void fol(int n, int m) {...} void fol(int *p) {...} void fol(int &z) {...} void fol(float q)

to underlying type

C++ struct A user-defined type consisting of fields, each of which with its own type. The dot operator (‘.’)is used to access a field of a struct variable, given its name. The pointer operator (‘->’) is used to access a field of a struct variable, given its address. Successive fields are mapped to successive locations. A struct is like a class in which all data fields are non- static and public and there are no methods.

Mangled name for the tests function in the preceding slide name length

struct iii {... }; void f(iii x) { … } What’s the mangled name for 3 int’s or struct iii? not ambiguous

A struct can be returned with a return statement in C++. Requires that the address of a return area be passed to the called function. See the program on the next slide.

totally on the stack very risky here if we are still using stack memory

mem[ac]=mem[sp++]

Are there pointers in Java? Reference parameters in C++ hide the passing and dereferencing of an address. Java hides its pointers in a similar fashion. On the next slide, both the C++ and Java programs dereference an address. In the C++ program, this process is explicit. In the Java program, this process is hidden.

p and q are Java references. What happens when q = p; is executed?

Pointers to functions Allowed in C++ The C++ compiler translates the name of a function not followed by parenthesis to a pointer to that function (i.e., to its address). For example, fp(3); is a function call, but fp is a pointer to the fp function.

Declaring a pointer to a function int (*p)(int x); p is a pointer to a function that is passed an int and returns an int. For example, int foo(int a) {...}

y = p(3); is difficult to translate, where p is a pointer to a function. add p ; the required call inst now in ac st * + 3 ldc 3 push dw 0 ; changes to a call dloc 1 st y call 0

Pointer arithmetic in C++ Arithmetic on pointers in C++ uses the size of the pointed to type as the unit size. For example, if p is a pointer to a struct consisting of 10 words, then p = p + 1; adds 10 (not 1) to p.

An array name is an address The name of an array without the square brackets points to the 1 st slot of the array. For example, given int table[3]; Then table by itself is the address of table[0]. That is, table (type is int pointer) and &table[0] (type is int pointer) are equivalent.

Using array name as a pointer The name of an array can be used as a pointer to that array (because it really is a pointer to the array). For example, given int table[3]; then *(table+ 2) = 99; and table[2] = 99; are equivalent.

Using a pointer to an array as if it were the name of the array A pointer to an array can be used as if it were the name of an array. int *p; int table[3]; p = table; /* p now points to table p and table have the same value and same type so we can use them interchangeably (almost). */ p[2] = 99; // use p as if it were an array name.

int table[3]; int *p; p = table; int x; p is a pointer variable; table is a pointer constant. So table cannot be assigned a new value. p = table + 1; // legal because p is a variable table = &x; // illegal, table always points to table[0]

Creating a global array (static local array is similar) int table[3]; table[2] = 7; is translated to ldc 7 st table + 2 table: dw 3 dup 0

Creating a dynamic local array void f() { int table[3]; table[2] = 7; } is translated to aloc 3 ldc 7 str 2

Accessing dynamic local array

Must compute the address of ga[x] at run time because the value of x is not known until run time.

Passing an array—really passing a pointer to 1 st slot int table[3]; … f(table); Passing a pointer to the first slot of table. Corresponding argument should be an int pointer.

Empty square brackets in an array parameter are interpreted by the compiler as meaning pointer void f(int t[ ]) { // t is an int * … }

Arrays as arguments

t is a pointer to table[0]. It can be used as a pointer, or as if it were the name of the array it is pointing to.

Equivalent forms

Control statements while do-while for if if-else

Assembly code for while

while

do-while

for

If-else

if

Better translation of while

Signed and unsigned comparisons Cannot be done easily on H1 because H1 does not have the S, V, and C flags. Subtracting two signed numbers and looking at the sign of the result yields the incorrect answer if overflow occurs. For now, we will assume overflow does not occur when performing comparisons.

Error in signed comparison Compare 8000 and 0001 by subtracting and testing the sign of the result: 8000 (-32,768) FFFF (-1) 7FFF Positive result implies (incorrectly) that the top number is bigger than the bottom number.

Incorrect assembly code (wrong if overflow occurs)

Multi-word addition Cannot be done easily on H1. z = x + y; where x, y, and z are double words is translated to ld x + 1 add y + 1 ; what if carry out? st z + 1 ld x add y st z

Bit-level operations Cannot be done easily on H1. Only jzop and jn are available on H1 for bit-level operations. These instructions test the msb in the ac register.

A program that converts decimal to binary. How to perform ‘&’ operation on line 13?

A recursive function is a function that calls itself. What is the output of the program on the next slide?

Output of program on preceding line is D D B U U Statements preceding the recursive call are executed “on the way down”. Statements following the recursive call are executed “on the way up”.

ldr 1 at the beginning of frec (line 1 of program on preceding slide) always loads the appropriate x.