lecture 7. instructions and high-level to machine code

15
Lecture 7. Instructions and High-Level to Machine Code Prof. Taeweon Suh Computer Science Education Korea University 2010 R&E Computer System Education & Research

Upload: amal

Post on 12-Jan-2016

49 views

Category:

Documents


2 download

DESCRIPTION

2010 R&E Computer System Education & Research. Lecture 7. Instructions and High-Level to Machine Code. Prof. Taeweon Suh Computer Science Education Korea University. Instructions and Instruction Set. If you want to talk to foreigners, you should be able to speak their languages - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Lecture 7. Instructions and High-Level to Machine Code

Lecture 7. Instructions and High-Level to Machine Code

Prof. Taeweon SuhComputer Science Education

Korea University

2010 R&E Computer System Education & Research

Page 2: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Instructions and Instruction Set

• If you want to talk to foreigners, you should be able to speak their languages Likewise, to talk to a computer, you must speak its language

• The words of a computer’s language are called instructions

• The collection of instructions is called instruction set

• Different CPUs have different instruction sets x86 has its own instruction set MIPS has its own instruction set But, they have many aspects in common

2

Page 3: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

MIPS Instruction examples in 2 forms

• Human-readable form

• Machine-readable form

3

addi $2, $0, 5 // $2 = $0 + 5sub $7, $7, $2 // $7 = $7 + $2and $5, $3, $4 // $5 = $3 & $4

0010 0000 0000 0010 0000 0000 0000 0101

0000 0000 1110 0010 0011 1000 0010 0010

0000 0000 0110 0100 0010 1000 0010 0100

= 0x20020005 // addi $2, $0, 5

= 0x00e23822 // sub $7, $7, $2

= 0x00642824 // and $5, $3, $4

Page 4: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Instruction Set Examples• x86

4

• MIPS

Page 5: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

MIPS and x86 Instruction Sets

5

• For more information on the complete instruction sets of MIPS and x86, refer to the following links Intel:

http://www.intel.com/products/processor/manuals/

MIPS:• We are going to study in detail throughout this course

Page 6: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

High Level Code to Assembly to Executable

• What steps did you take to run your program after writing your code “hello.c” on your Linux machine?

%gcc hello.c -o hello” // hello is a machine code (binary or executable)

%./hello % Hello World! %objdump –D hello // it shows human-readable code

6

#include <stdio.h>

int main(void){ printf("Hello World!\n"); return 0;}

Page 7: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Reality check: High Level Code to Assembly to Executable

7

C program

compiler

assembly code

executable

library routines

linker

loader

memory

Machine code

preprocessor

Expanded C program

assembler

object codeHuman-readable assembly code

cpp (C-preprocessor) in Linux GNU C

gcc in Linux GNU C

as in Linux GNU

ld in Linux GNU

Linux kernel loads the executable into

memory

Page 8: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Reality check: High Level Code to Assembly to Executable (Cont)

• The command “gcc” hides all the details

• Try to compile hello.c with “gcc –v hello.c –o hello” You will see all the details of what gcc does for

compilation

• Compilation goes through several steps to generate machine code Preprocessor Compilation Assembler Linker

8

#include <stdio.h>

int main(void){ printf("Hello World!\n"); return 0;}

Page 9: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Reality check: High Level Code to Assembly to Executable (Cont)

• Preprocessing Use to expand macros and header files included %cpp hello.c > hello.i

• open “hello.i” to see what you got

• Compilation Actual compilation of the preprocessed code to

assembly language for a specific processor %gcc -Wall -S hello.i

• Result will be stored in hello.s • Open hello.s to see what you got

• Assembler Convert assembly language into machine code and

generate an object file %as hello.s -o hello.o

• The resulting file ‘hello.o’ contains the machine instructions for the Hello World program, with an undefined reference to printf

9

Page 10: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Reality check: High Level Code to Assembly to Executable (Cont)

• Linker Final stage of compilation Linking object files to create an executable In practice, an executable requires many external functions

from system and C run-time (crt) libraries Consequently, the actual link commands used internally by

GCC are complicated. Example

• %ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i386-redhat-linux/4.3.0/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.3.0 hello.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /usr/lib/gcc/i386-redhat-linux/4.3.0/crtend.o /usr/lib/crtn.o -o hello

• Note that “i386-redhat-linux/4.3.0/” is dependent on your Linux version

• Now run your program %./hello // Linux kernel loads the program into memory %Hello World! // output

10

Page 11: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Stored Program Concept

11

Memory (DDR)CPU

North Bridge

South Bridg

e

Main Memor

y(DDR)

FSB (Front-Side Bus)

DMI (Direct Media I/F) CPU

Hello World Binary (machine code)

C compiler (machine code)

“Hello World” Source code in C

01101000 01100000 00110011 11100101 11100111 00110000 01010101 1100001110100000 00011111 11100111 0001111011110011 11000011 00110011 01010101

11110011 11000011 00110011 01010101

10100000 00011111 11100111 00011110

11100111 00110000 01010101 11000011

01101000 01100000 00110011 11100101

• Instructions are represented in binary, just like data

• Instructions and data are stored in memory• CPU fetches instructions and data to execute• Programs can operate on programs

e.g., compilers, linkers, …• Binary compatibility allows compiled programs to work

on different computers Standardized ISAs

Address Bus

Data Bus

Page 12: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Cross Compiler

• Hmmm, sound good so far• But, wait! We are talking about MIPS (not x86). Then, How to

generate the MIPS machine code without a MIPS machine? • You are still able to generate MIPS binaries on an x86 machine…

How? Use a cross-compiler!!!

12

int main(){ int a, b, c; a = 3; b = 9; c = a + b; return c;}

x86-based laptop

MIPS-based laptop

(if present!)

int main(){ int a, b, c; a = 3; b = 9; c = a + b; return c;}

compile

compile

a = 3;24020003 li v0,3afc20008 sw v0,8(s8)b = 9;24020009 li v0,9afc20004 sw v0,4(s8)c = a + b;8fc30008 lw v1,8(s8)8fc20004 lw v0,4(s8)00000000 nop00621021 addu v0,v1,v0afc20000 sw v0,0(s8)

MIPS machine codeNormalcompilation

a = 3;c7 45 f0 03 00 00 00 movl $0x3,-0x10(%ebp)b = 9;c7 45 f4 09 00 00 00 movl $0x9,-0xc(%ebp)c = a + b;8b 55 f4 mov -0xc(%ebp),%edx8b 45 f0 mov -0x10(%ebp),%eax01 d0 add %edx,%eax89 45 f8 mov %eax,-0x8(%ebp)

x86 machine code

Page 13: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

Cross Compiler (Cont.)

• A cross compiler is a compiler capable of creating executable code for a platform other than the one on which the compiler is run -- Wiki

13

int main(){ int a, b, c; a = 3; b = 9; c = a + b; return c;}

x86-based laptop

compile

cross-compile

a = 3;24020003 li v0,3afc20008 sw v0,8(s8)b = 9;24020009 li v0,9afc20004 sw v0,4(s8)c = a + b;8fc30008 lw v1,8(s8)8fc20004 lw v0,4(s8)00000000 nop00621021 addu v0,v1,v0afc20000 sw v0,0(s8)

MIPS machine code

a = 3;c7 45 f0 03 00 00 00 movl $0x3,-0x10(%ebp)b = 9;c7 45 f4 09 00 00 00 movl $0x9,-0xc(%ebp)c = a + b;8b 55 f4 mov -0xc(%ebp),%edx8b 45 f0 mov -0x10(%ebp),%eax01 d0 add %edx,%eax89 45 f8 mov %eax,-0x8(%ebp)

x86 machine code

Page 14: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

MIPS Cross Compiler

• Check out the class web for instructions on how to build the MIPS cross-compiler on x86-based Linux

• Test-generate binary from the MIPS assembly program with assembler

14

add $t0, $s1, $s2 # $t0 <= $s1 + $s2sub $t2, $s3, $s4 # $t2 <= $s3 - $s4lw $t0, 24($s3) #load (read) word from memory # $t0 <= [$s3 + 24]sw $t2, 8($s3) # store(write) word to memory # [$s3 + 8] <= $t2

0x0232 40200x0274 50220x8E68 00180xAE6A 0008

MIPSCPU

Memory (DDR)Address Bus

Data Bus

0x0232 40200x0274 50220x8E68 00180xAE6A 0008

Don’t worry. We are going to talk deep about this!

assembler

Page 15: Lecture 7. Instructions and High-Level to Machine Code

Korea Univ

This Course …

• In this course, you need to write some (or many) MIPS assembly code

• Then, use MIPS assembler to assemble your (assembly) program and a linker to generate executable (binary) We don’t use preprocessor and compiler to generate assembly

code because we don’t do high-level programming here

• Finally, run your code in the MIPS simulator called SPIM Then, run your code on the CPU you’ll design later!!!

• The compiler course (COMP417) hopefully covers details about preprocessor and compiler (and assembler, linker, and loader)

• Let’s go over MIPS instructions in a great detail from the next class

15