Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
C Sharp syntax wikipedia , lookup
Name mangling wikipedia , lookup
Library (computing) wikipedia , lookup
C Sharp (programming language) wikipedia , lookup
Program optimization wikipedia , lookup
History of compiler construction wikipedia , lookup
Assembly language wikipedia , lookup
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 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 Korea Univ MIPS Instruction examples in 2 forms • Human-readable form addi $2, $0, 5 sub $7, $7, $2 and $5, $3, $4 // $2 = $0 + 5 // $7 = $7 + $2 // $5 = $3 & $4 • Machine-readable form 0010 0000 0000 0010 0000 0000 0000 0101 = 0x20020005 // addi $2, $0, 5 0000 0000 1110 0010 0011 1000 0010 0010 = 0x00e23822 // sub $7, $7, $2 0000 0000 0110 0100 0010 1000 0010 0100 = 0x00642824 // and $5, $3, $4 3 Korea Univ Instruction Set Examples • MIPS • x86 4 Korea Univ MIPS and x86 Instruction Sets • 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 5 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? #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } %gcc hello.c -o hello” %./hello % Hello World! %objdump –D hello // hello is a machine code (binary or executable) // it shows human-readable code 6 Korea Univ Reality check: High Level Code to Assembly to Executable C program preprocessor cpp (C-preprocessor) in Linux GNU C Expanded C program compiler gcc in Linux GNU C assembly code as in Linux GNU assembler Human-readable assembly code object code library routines linker Machine code ld in Linux GNU executable Linux kernel loads the executable into memory 7 loader memory 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 #include <stdio.h> Preprocessor Compilation Assembler Linker int main(void) { printf("Hello World!\n"); return 0; } 8 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 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/i386redhat-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 Korea Univ Stored Program Concept Memory (DDR) CPU FSB (Front-Side Bus) Main Memory (DDR) Address Bus North Bridge DMI (Direct Media I/F) South Bridge CPU Data Bus • • • • 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 • Binary compatibility allows compiled programs to work on different computers e.g., compilers, linkers, … Standardized ISAs 11 Hello World Binary (machine code) 01101000 11100111 10100000 11110011 01100000 00110011 00110000 01010101 00011111 11100111 11000011 00110011 11100101 11000011 00011110 01010101 C compiler (machine code) “Hello World” Source code in C 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!!! x86 machine code Normal compilation int main() { int a, b, c; a = 3; b = 9; c = a + b; return c; } int main() { int a, b, c; a = 3; b = 9; c = a + b; return c; } x86-based laptop compile a = 3; c7 45 f0 03 00 00 00 b = 9; c7 45 f4 09 00 00 00 c = a + b; 8b 55 f4 8b 45 f0 01 d0 89 45 f8 movl $0x3,-0x10(%ebp) movl $0x9,-0xc(%ebp) mov -0xc(%ebp),%edx mov -0x10(%ebp),%eax add %edx,%eax mov %eax,-0x8(%ebp) MIPS machine code MIPS-based laptop (if present!) compile 12 a = 3; 24020003 afc20008 b = 9; 24020009 afc20004 c = a + b; 8fc30008 8fc20004 00000000 00621021 afc20000 li sw v0,3 v0,8(s8) li sw v0,9 v0,4(s8) lw lw nop addu sw v1,8(s8) v0,4(s8) v0,v1,v0 v0,0(s8) 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 x86 machine code x86-based laptop int main() { int a, b, c; a = 3; b = 9; c = a + b; return c; } a = 3; c7 45 f0 03 00 00 00 b = 9; c7 45 f4 09 00 00 00 c = a + b; 8b 55 f4 8b 45 f0 01 d0 89 45 f8 compile cross-compile 13 movl $0x3,-0x10(%ebp) movl $0x9,-0xc(%ebp) mov -0xc(%ebp),%edx mov -0x10(%ebp),%eax add %edx,%eax mov %eax,-0x8(%ebp) MIPS machine code a = 3; 24020003 afc20008 b = 9; 24020009 afc20004 c = a + b; 8fc30008 8fc20004 00000000 00621021 afc20000 li sw v0,3 v0,8(s8) li sw v0,9 v0,4(s8) lw lw nop addu sw v1,8(s8) v0,4(s8) v0,v1,v0 v0,0(s8) 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 add sub lw sw $t0, $s1, $s2 # $t0 <= $s1 + $s2 $t2, $s3, $s4 # $t2 <= $s3 - $s4 $t0, 24($s3) #load (read) word from memory # $t0 <= [$s3 + 24] $t2, 8($s3) # store(write) word to memory # [$s3 + 8] <= $t2 0x0232 0x0274 0x8E68 assembler 0xAE6A 4020 5022 0018 0008 Don’t worry. We are going to talk deep about this! Address Bus MIPS CPU Memory (DDR) 0x0232 0x0274 0x8E68 0xAE6A 4020 5022 0018 0008 Data Bus 14 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 Korea Univ