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
XToy Programming Translating high level language into machine code program Add // Input: Stored in memory location 00 and 01 // Output: Sum of two integers 5 + 8 = D // saved in memory location 02 High level language 1) int a = 8; 2) int b = 5; 3) int c = a + b; 0) 8 has to be in memory 0) 5 has to be in memory Machine code •00: 0008 8 •01: 0005 5 •02: 0000 0 •10: 8A00 R[A] <- mem[00] •11: 8B01 R[B] <- mem[01] •12: 1CAB R[C] <- R[A] + R[B] •13: 9C02 mem[02] <- R[C] •14: 0000 halt 1) put contents of memory location 00 into register A 2) put contents of memory location 01 into register B 3) put results of addition into register C 0) save contents of register C into memory location 2 program Sum // Input: Sequence of non-zero integers, followed by 0000 // Output: The sum of all the integers High level language 1) sum = 0 ; 2) while (true) 3) { 4) 5) 6) read a ; if (a == 0) break ; sum = sum + a ; 7) } Machine code •10: 7C00 •11: 8AFF •12: CA15 •13: 1CCA •14: C011 •15: 9CFF •16: 0000 RC <- 0000 read RA if (RA == 0) pc <- 15 RC <- RC + RA pc <- 11 write RC halt 8) write sum ; 1) We could store 0 in a register (e.g. C) 2) Its an infinite loop so we must come back here when line 7 is executed 4) Read in a value from stdin and save in register A 5) If the value we read in is zero .. then finish .. ie jump to line 8 6) Add contents of register A to the current value in register C 7) Jump back to line 2 8) When we do finish we print out answer to user Now we can see the benefits of “pseudo-code”. •0A: 0003 •0B: 0009 •0C: 0000 3 9 0 •0D: 0000 •0E: 0001 0 1 •10: 8A0A •11: 8B0B •12: 8C0D •13: 810E RA <- mem[0A] RB <- mem[0B] RC <- mem[0D] R1 <- mem[0E] •14: CA18 •15: 1CCB •16: 2AA1 •17: C014 •18: 9C0C •19: 0000 if (RA == 0) pc goto 18 RC <- RC + RB RA <- RA - R1 pc <- 14 mem[0C] <- RC halt TOY idioms • Register-to-register transfer. – Suppose you want to make register 2 have the same value as register 1. – There is no built-in instruction to do this. – Relying on the fact that register 0 always contains 0000, we can use the addition instruction to sum up R0 and R1 and put the result in R2. 10: 1201 R[2] <- R[0] + R[1] TOY idioms • No-op – In a structured programming language like Java inserting extra code is easy. – But in an unstructured language like TOY (where there are line numbers and goto statements), you must be careful about inserting code. – A branch statement hardwires in the memory address to jump to; • if you insert code, the line numbers of your program may change. • To avoid some of this awkwardness, machine language programmers often find it convenient to fill in the program with "useless" statements to act as placeholders. – Such statements are called no-ops because they perform no operation. – The instruction 1000 is ideal for this purpose since register 0 is always 0 anyway. (The instruction 10xy would also be a no-op for any values of x and y because register 0 always contains 0, regardless of how you might try to change it. TOY idioms • Goto – There is no instruction that directly changes the program counter to the particular address. • Like a GOTO statement – However, it is easy to use the “branch if zero” instruction with register 0 to achieve the same effect. – For example, the instruction C0F0 changes the program counter to F0 since register 0 is always 0. • So its like saying GOTO FO Arrays • Arrays are not directly built into the TOY language, but it is possible to achieve the same functionality using the – load address, load indirect, and store indirect instructions. • We consider a program that reads in a sequence of integers and prints them in reverse order. Reads in a sequence of integers and prints them in reverse order.