A Simple Computer March, 2012

Total Page:16

File Type:pdf, Size:1020Kb

A Simple Computer March, 2012 Cmpt 150 A Simple Computer March, 2012 A Simple Computer It’s time to assemble some pieces and create a computer. We’re not going to cover this in depth — many details will be swept under the rug — but at the end we should have a pretty good idea of how assembly language connects with the underlying hardware. Instruction Set Architecture The true specification for a CPU is the instruction set architecture (ISA). In plain language, the set of instructions that the CPU hardware is capable of recognising and executing. In the roughly 70 years since the first digital computers were constructed1 hardware and software have co-evolved to their present state. Today there are two broad classes of ISAs: e Complex Instruction Set (CISC) ISAs are the older class, evolved from the pe- riod when the guiding philosophy was a rich set of machine instructions that facilitated assembly language programming by humans and closely matched the requirements of evolving higher-level programming languages (e.g., For- tran and Cobol). The dominant CISC ISA today is the Intel x86 instruction set. e Reduced Instruction Set (RISC) ISAs are the newer class, evolving from the observation that the vast majority of assembly language today is written by compilers. RISC ISAs have a bare minimum of instructions, chosen to min- imise hardware complexity and maximise speed of execution. Multiple RISC instructions are often required to do the work of a single CISC instruction, but even so can be executed more quickly. Compilers and assemblers do the tedious work of translating programs in high-level language into machine instructions. RISC ISAs are also referred to as load/store instruction sets, because only load and store instructions can transfer data between the CPU registers and RAM memory. All other instructions operate on data in registers The dominant RISC ISAs today are the SPARC, MIPS, and PowerPC archi- tectures. 1Depending on where you want to start, the Atanasoff-Berry computer in 1937, the Harvard Mark I in 1944, or the Manchester SSEM in 1948. The SSEM was the first implementation of a computer where instructions and data were both stored in memory, the von Neumann architecture. 1 Cmpt 150 A Simple Computer March, 2012 It’s worth pointing out that Intel has put a huge amount of effort into speeding up the execution of their CISC ISA, and it can be argued that the resulting CPU hardware essentially translates the CISC instructions into RISC instructions on- the-fly for execution by the hardware. The ISA presented by Mano in Chapter 9 of the text is a RISC architecture. The ISA implemented in the HC12 is a CISC architecture. We’ll explore the differences when we’ve had a chance to look at both. A CPU implements an algorithm called the instruction execution cycle to pro- cess the instructions of a program. Here are the steps: 1. Instruction Fetch: Fetch the instruction from memory into the CPU for pro- cessing. 2. Instruction Decode: Inspect the instruction to see what operation it specifies, what operands it needs, and what it will do with the result. 3. Operand Fetch: Make the operands available to the appropriate functional unit for execution. 4. Operation Execution: Perform the operations specified by the instruction using the operands fetched in the previous step. 5. Store Result: Store the result of the operation. All instructions require fetch and decode, but some instructions do not need all of the last three steps. In that case, the hardware is instructed to perform an appropriate ‘no operation’ for that particular step. We’ll see how this is done shortly. The number of clock periods required to execute an instruction, and the length of the clock period, depend on the the details of the implementation. We will design a simple, but relatively slow, implementation. The Mano Simple Computer Instruction Set Table 1 shows the complete instruction set for the Mano Simple Computer. This is a RISC (load/store) instruction set, recognisable because only the load (LD) and store (ST) instructions can transfer data between the registers and mem- ory. All other instructions operate on data in the registers. Digital hardware understands only 1’s and 0’s, so the assembly language of Table 1 must be translated into machine language using the formats shown in Figure 1. Let’s consider a few examples: 2 Cmpt 150 A Simple Computer March, 2012 Operation Mnemonic Opcode Action Status Fmt Move A MOVA 0000000 R[DR] ¬ R[SA] N, Z R Increment INC 0000001 R[DR] ¬ R[SA] + 1 N, Z R Add ADD 0000010 R[DR] ¬ R[SA] + R[SB] N, Z R Subtract SUB 0000101 R[DR] ¬ R[SA] + R[SB] + 1 N, Z R Decrement DEC 0000110 R[DR] ¬ R[SA] − 1 N, Z R AND AND 0001000 R[DR] ¬ R[SA] ∧ R[SB] N, Z R OR OR 0001001 R[DR] ¬ R[SA] ∨ R[SB] N, Z R Exclusive-OR XOR 0001010 R[DR] ¬ R[SA] Å R[SB] N, Z R NOT NOT 0001011 R[DR] ¬ R[SA] N, Z R Move B MOVB 0001100 R[DR] ¬ R[SB]R Shift Right SHR 0001101 R[DR] ¬ sr R[SB]R Shift Left SHL 0001110 R[DR] ¬ sl R[SB]R Load Immediate LDI 1001100 R[DR] ¬ zf OP I Add Immediate ADI 1000010 R[DR] ¬ R[SA] + zf OP N, Z I Load LD 0010000 R[DR] ¬ M[R[SA]] R Store ST 0100000 M[R[SA]] ¬ R[SB]R Branch on Zero BRZ 1100000 if (R[SA] = 0) PC ¬ PC + se AD N,Z J if (R[SA] ¹ 0) PC ¬ PC + 1 Branch on Negative BRN 1100001 if (R[SA] < 0) PC ¬ PC + se AD N, Z J if (R[SA] ³ 0) PC ¬ PC + 1 Jump JMP 1110000 PC ¬ R[SA]J Where no PC assignment is specified, the instruction performs PC ¬ PC + 1. Table 1: Mano Simple Computer Instruction Set ([1, Table 9-8]) e Supppose that we want to subtract the contents of R[4] from R[5], placing the result in R[7]. In assembly language, we would write SUB R7, R5, R4 In machine language, this is an R format instruction: 15 9 8 6 5 3 2 0 0000101 111 101 100 e Supppose that we want to load R[6] with the constant 7. In assembly lan- guage, we would write LDI R6, 7 3 Cmpt 150 A Simple Computer March, 2012 15 9 8 6 5 3 2 0 Destination Source Source Opcode Register (DR) Register A (SA) Register B (SB) 15 9 8 6 5 3 2 0 Destination Source Opcode Operand (OP) Register (DR) Register A (SA) 15 9 8 6 5 3 2 0 Address (AD) Source Address (AD) Opcode Left Register A (SA) Right Figure 1: Machine Instruction Formats for the Mano Simple Computer ([1, Fig- ure 9-14]) In machine language, this is an I format instruction: 15 9 8 6 5 3 2 0 1001100 110 000 111 Note that the value of the RA field is not used; the actual value is unimpor- tant so it’s set to zero. e Supppose that we want to branch to PC − 5 if the value in R[3] is less than zero. In assembly language, we would write BRN R3, -5 In machine language, this is a J format instruction: 15 9 8 6 5 3 2 0 1100001 111 011 011 Remember that for a branch instruction, the values of the RD and RB fields are concatenated to form a six-bit two’s-complement value; in this case, −5 = 111011. To get an understanding of how all of this fits together, let’s consider the fol- lowing (Java) program fragment: int[] arrayOfInt = new int[7] ; for (int ndx = 6 ; ndx >= 0 ; ndx = ndx-1) arrayOfInt[ndx] = -ndx ; How could we implement this in the Simple Computer? There are a number of issues to consider: 4 Cmpt 150 A Simple Computer March, 2012 e Every data item requires space. We’ll have to identify some space in registers or memory to hold the values for ndx and arrayOfInt. And once we’ve decided on where to put them, we’ll have to figure out a way to create those values in our program. e Then there’s the matter of constructing the loop from the available instruc- tions. Let’s see how we might go about this. Suppose that I decide to place my array at location 42 in memory. I’ll need to set a register to the value 42 so that I can use it in a ST instruction. A quick glance at the instruction set is enough to see that the largest value I can specify as an immediate operand in an instruction is 7. How can I construct the value 42? One trick is to use shift left to multiply by 2. I can construct the value 42 as 8 ´ 5 + 2: LDI R7, 5 ; Load R7 with the seed SHL R7, R7 ; x 2 = 10 SHL R7, R7 ; x 2 = 20 SHL R7, R7 ; x 2 = 40 ADI R7, R7, 2 ; R7 now contains 42 This is more work that you might expect, and a practical instruction set will include the ability to specify immediate operands of a practical size (at least 16 bits) and the ability to shift by a variable amount. Even so, you may occasionally find yourself faced with a similar task. Another thing to take away from this example is that we need temporary reg- isters to hold intermediate values. If there are not enough registers, intermediate values must be stored in memory and recovered as needed.
Recommended publications
  • Y86 Programming
    10/28/2019 Outline Chapter 4 Introduction to assembly programing Processor Architecture: Y86 Introduction to Y86 Y86 instructions, encoding and execution (Sections 4.1 & 4.3) with material from Dr. Bin Ren, College of William & Mary 1 2 Assembly Assembly Operations Perform arithmetic function on register or memory data The CPU uses machine language to perform all its operations Transfer data between memory and register Machine code (pure numbers) is generated by translating each . Load data from memory into register (read) instruction into binary numbers that the CPU uses . Store register data into memory (write) This process is called "assembling"; conversely, we can take Transfer control assembled code and disassemble it into (mostly) human . Unconditional jumps to/from procedures (calls) readable assembly language . Conditional branches (if, switch, for, while, etc) Assembly is a much more readable translation of machine language, and it is what we work with if we need to see what the computer is doing There are many different kinds of assembly languages; we'll focus on the Y86/IA32 language as defined in the text and on our system (also SPARC and MIPS) 3 4 ISA – Instruction Set Architecture ISA-More explanations ISA – instruction set architecture . Format and behavior of a machine level program . Defines . The processor state (see the CPU fetch-execute cycle) . The format of the instructions . The effect of each of these instructions on the state . Abstractions . Instruction executed “in sequence” – Technically defined to be completing one instruction before starting the next – Pipelining – Concurrent execution (but not really) . Memory addresses are virtual addresses – Very large byte-addressable array – Address space managed by the OS (virtual physical) – Contains both executable code of the program AND its data » Run-time stack » Block of memory for user (global and heap) 5 6 1 10/28/2019 Generic Instruction Cycle Hardware abstractions An instruction cycle is the basic operation cycle of a computer.
    [Show full text]
  • X86 Instruction Set 4.2 Why Learn Assembly
    4.1 CS356 Unit 4 Intro to x86 Instruction Set 4.2 Why Learn Assembly • To understand something of the limitation of the HW we are running on • Helpful to understand performance • To utilize certain HW options that high-level languages don't allow (e.g. operating systems, utilizing special HW features, etc.) • To understand possible security vulnerabilities or exploits • Can help debugging 4.3 Compilation Process CS:APP 3.2.2 void abs(int x, int* res) • Demo of assembler { if(x < 0) *res = -x; – $ g++ -Og -c -S file1.cpp else *res = x; • Demo of hexdump } Original Code – $ g++ -Og -c file1.cpp – $ hexdump -C file1.o | more Disassembly of section .text: 0000000000000000 <_Z3absiPi>: 0: 85 ff test %edi,%edi 2: 79 05 jns 9 <_Z3absiPi+0x9> • Demo of 4: f7 df neg %edi 6: 89 3e mov %edi,(%rsi) 8: c3 retq objdump/disassembler 9: 89 3e mov %edi,(%rsi) b: c3 retq – $ g++ -Og -c file1.cpp Compiler Output – $ objdump -d file1.o (Machine code & Assembly) Notice how each instruction is turned into binary (shown in hex) 4.4 Where Does It Live • Match (1-Processor / 2-Memory / 3-Disk Drive) where each item resides: – Source Code (.c/.java) = 3 – Running Program Code = 2 – Global Variables = 2 – Compiled Executable (Before It Executes) = 3 – Current Instruction Being Executed = 1 – Local Variables = 2 (1) Processor (2) Memory (3) Disk Drive 4.5 BASIC COMPUTER ORGANIZATION 4.6 Processor • Performs the same 3-step process over and over again – Fetch an instruction from Processor Arithmetic 3 Add the memory Circuitry specified values Decode 2 It’s an ADD – Decode the instruction Circuitry • Is it an ADD, SUB, etc.? 1 Fetch – Execute the instruction Instruction System Bus • Perform the specified operation • This process is known as the ADD SUB Instruction Cycle CMP Memory 4.7 Processor CS:APP 1.4 • 3 Primary Components inside a processor – ALU – Registers – Control Circuitry • Connects to memory and I/O via address, data, and control buses (bus = group of wires) Bus Processor Memory PC/IP 0 Addr Control 0 op.
    [Show full text]
  • Jump-Oriented Programming: a New Class of Code-Reuse Attack
    Jump-Oriented Programming: A New Class of Code-Reuse Attack Tyler Bletsch, Xuxian Jiang, Vince W. Freeh Zhenkai Liang Department of Computer Science School of Computing North Carolina State University National University of Singapore {tkbletsc, xuxian_jiang, vwfreeh}@ncsu.edu [email protected] ABSTRACT to redirect control flow to the attacker-supplied code. How- Return-oriented programming is an effective code-reuse at- ever, with the advent of CPUs and operating systems that tack in which short code sequences ending in a ret instruc- support the W⊕X guarantee [3], this threat has been mit- tion are found within existing binaries and executed in ar- igated in many contexts. In particular, W⊕X enforces the bitrary order by taking control of the stack. This allows property that \a given memory page will never be both for Turing-complete behavior in the target program without writable and executable at the same time." The basic premise the need for injecting attack code, thus significantly negat- behind it is that if a page cannot be written to and later ex- ing current code injection defense efforts (e.g., W⊕X). On ecuted from, code injection becomes impossible. the other hand, its inherent characteristics, such as the re- Unfortunately, attackers have developed innovative ways liance on the stack and the consecutive execution of return- to defeat W⊕X. For example, one possible way is to launch oriented gadgets, have prompted a variety of defenses to a code-reuse attack, wherein existing code is re-purposed to detect or prevent it from happening. a malicious end.
    [Show full text]
  • X86 Assembly Language Reference Manual
    x86 Assembly Language Reference Manual Sun Microsystems, Inc. 901 N. San Antonio Road Palo Alto, CA 94303-4900 U.S.A. Part No: 805-4693-10 October 1998 Copyright 1998 Sun Microsystems, Inc. 901 San Antonio Road, Palo Alto, California 94303-4900 U.S.A. All rights reserved. This product or document is protected by copyright and distributed under licenses restricting its use, copying, distribution, and decompilation. No part of this product or document may be reproduced in any form by any means without prior written authorization of Sun and its licensors, if any. Third-party software, including font technology, is copyrighted and licensed from Sun suppliers. Parts of the product may be derived from Berkeley BSD systems, licensed from the University of California. UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open Company, Ltd. Sun, Sun Microsystems, the Sun logo, SunDocs, Java, the Java Coffee Cup logo, and Solaris are trademarks, registered trademarks, or service marks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the U.S. and other countries. Products bearing SPARC trademarks are based upon an architecture developed by Sun Microsystems, Inc. The OPEN LOOK and SunTM Graphical User Interface was developed by Sun Microsystems, Inc. for its users and licensees. Sun acknowledges the pioneering efforts of Xerox in researching and developing the concept of visual or graphical user interfaces for the computer industry. Sun holds a non-exclusive license from Xerox to the Xerox Graphical User Interface, which license also covers Sun’s licensees who implement OPEN LOOK GUIs and otherwise comply with Sun’s written license agreements.
    [Show full text]
  • X86 Instruction Set Architecture
    x86 Instruction Set Architecture Comprehensive 32/64-bit Coverage First Edition Also by Tom Shanley HEAVEN’S FAVORITE —A Novel of Genghis Khan— Book 1, ASCENT: THE RISE OF CHINGGIS KHAN Book 2, DOMINION: DAWN OF THE MONGOL EMPIRE MINDSHARE TECHNICAL TRAINING Please visit www.mindshare.com for a complete description of Mind- Share’s technical offerings: • Books • eBooks • eLearning modules • Public courses • On-site course • On-line courses Intel Core 2 Processor (Penryn) Intel Nehalem Processor Intel Atom Processor AMD Opteron Processor (Barcelona) Intel 32/64-bit x86 Software Architecture AMD 32/64-bit x86 Software Architecture x86 Assembly Language Programming Protected Mode Programming PC Virtualization IO Virtualization (IOV) Computer Architectures with Intel Chipsets Intel QuickPath Interconnect (QPI) PCI Express 2.0 USB 2.0 USB 3.0 Embedded USB 2.0 Workshop PCI PCI-X Modern DRAM Architecture SAS Serial ATA High Speed Design EMI / EMC Bluetooth Wireless Product Development SMT Manufacturing SMT Testing x86 Instruction Set Architecture Comprehensive 32/64-bit Coverage First Edition MINDSHARE, INC. TOM SHANLEY MindShare Press Colorado Springs, USA Refer to “Trademarks” on page 5 for trademark information. The author and publisher have taken care in preparation of this book but make no expressed or implied warranty of any kind and assume no responsibility for errors or omissions. No liability is assumed for incidental or consequential damages in connec- tion with or arising out of the use of the information or programs contained herein. ISBN: 0-9770878-5-3 Copyright © 2009 by MindShare, Inc. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, photocopy- ing, recording, or otherwise, without the prior written permission of the publisher.
    [Show full text]
  • Registers Memory Segmentation and Protection
    Intel x86 Assembly Language Programming CIS 450 { Computer Organization and Architecture c Copyright 2001 Tim Bower The Intel x86 line of CPUs use the accumulator machine mo del. Registers Note that each register has 32 bit, 16 bit and 8 bit names. We will usually use just the 32 bit names for the registers. See the diagrams of the registers on the following pages. The primary accumulator register is called EAX. The return value from a function call is saved in the EAX register. Secondary accumulator registers are: EBX, ECX, EDX. EBX is often used to hold the starting address of an array. ECX is often used as a counter or index register for an array oraloop. EDXis a general purp ose register. The EBP register is the stack frame pointer. It is used to facilitate calling and returning from functions. ESI and EDI are general purp ose registers. If a variable is to have register storage class, it is often stored in either ESI or EDI. A few instructions use ESI and EDI as p ointers to source and destination addresses when copying a blo ck of data. Most compilers preserve the value of ESI and EDI across function calls | not generally true of the accumulator registers. The ESP register is the stack p ointer. It is a p ointer to the \top" of the stack. The EFLAGS register is sometimes also called the status register. Several instructions either set or check individual bits in this register. For example, the sign ag bit 7 and the zero ag bit 6 are set by the compare cmp instruction and checked by all the conditional branching instructions.
    [Show full text]
  • IBCM: the Itty Bitty Computing Machine
    Chapter 1 IBCM: The Itty Bitty Computing Machine The child receives data through the sense organs; the child also has some inborn processing capacities – otherwise it would not be able to learn – but in addition, some “information” or “programs” are built-in at birth . there is a working memory . and there is a permanent memory . so there must be some inner “language” or medium of representation . Jerry Fodor . has discussed this inbuilt “language of thought,” which is similar conceptually to the “machine language” that is built into the personal computer. – John Cleverly, in “Visions of childhood: Influential models from Locke to Spock” [3] 1.1 Introduction Machine language, or machine code, is the set of instructions that a computer’s central processing unit (CPU) understands. It is the binary 0’s and 1’s that form instructions for the CPU to execute. When we compile a program, that program is eventually converted to binary machine code, which we can then run. Each different CPU has a different machine language that it understands, although CPU families tend to understand a very similar language. Programming in machine language requires one to write the code in hexadecimal notation, manually encoding the instructions one at a time. For this reason, machine language can often be difficult to pro- gram in. This is especially true with the complexities of modern instruction sets on processor families such as the x86 and MIPS. One will often write a program in assembly language, which is a (somewhat) higher-level manner to create a program. In assembly language, one can specify to add two values together through a command such as sub esp, 24, and need not write it in the hexadecimal notation of 0x83ec20.
    [Show full text]