Computer Organization & Assembly Language: CS/COE0447
Computer Organization & Assembly Language: CS/COE0447
Computer Organization & Assembly Language: CS/COE0447
Chapter 3
1
Topics
• Negative binary integers
– Sign magnitude, 1’s complement, 2’s complement
– Sign extension, ranges, arithmetic
• Signed versus unsigned operations
• Overflow (signed and unsigned)
• Branch instructions: branching backwards
• Implementation of addition
• Chapter 3 Part 2 will cover:
– Implementations of multiplication, division
– Floating point numbers
• Binary fractions
• IEEE 754 floating point standard
• Operations
– underflow
– Implementations of addition and multiplication (less detail than for integers)
– Floating-point instructions in MIPS
– Guard and Round bits
2
Computer Organization
3
Binary Arithmetic
• So far we have studied
– Instruction set basics
– Assembly & machine language
5
Unsigned Binary Numbers
• Limited number of binary numbers (patterns of 0s and 1s)
– 8-bit number: 256 patterns, 00000000 to 11111111
– General: 2N bit patterns in N bits
• 16 bits: 216 = 65,536 bit patterns
• 32 bits: 232 = 4,294,967,296 bit patterns
• Unsigned numbers use the patters for 0 and positive numbers
– 8-bit number range corresponds to
• 00000000 0
• 00000001 1
• …
• 11111111 255
– 32-bit number range [0..4294967296]
– In general, the range is [0…2N-1]
• Addition and subtraction: as in decimal (on board)
6
Unsigned Binary Numbers in MIPS
• MIPS instruction set provides support
– addu $1,$2,$3 - adds two unsigned numbers
– Addiu $1,$2,33 – adds unsigned number with SIGNED
immediate (see green card!)
– Subu $1,$2,$3
– Etc
• In MIPS: the carry/borrow out is ignored
– Overflow is possible, but hardware ignores it
– Signed instructions throw exceptions on overflow (see footnote 1
on green card)
• Unsigned memory accesses: lbu, lhu
– Loaded value is treated as unsigned
– Convert from smaller bit width (8, 16) to 32 bits
– Upper bits in the 32-bit destination register are set to 0s (see
green card)
7
Important 7-bit Unsigned Numbers
• American Standard Code for Information
Interchange (ASCII)
– 7 bits used for the characters
– 8th bit may be used for error detection (parity)
8
Signed Numbers
• How shall we represent both positive and
negative numbers?
• We still have a limited number of bits
– N bits: 2N bit patterns
• We will assign values to bit patterns
differently
– Some will be assigned to positive numbers and
some to negative numbers
• 3 Ways: sign magnitude, 1’s complement,
2’s complement
9
Method 1: Sign Magnitude
• {sign bit, absolute value (magnitude)}
– Sign bit
• “0” – positive number
• “1” – negative number
– EX. (assume 4-bit representation)
• 0000: 0
• 0011: 3
• 1001: -1
• 1111: -7
• 1000: -0
• Properties
– two representations of zero
– equal number of positive and negative numbers
10
Method 2: One’s Complement
• ((2N-1) – number): To multiply a 1’s Complement number by -1,
subtract the number from (2N-1)_unsigned. Or, equivalently (and
easily!), simply flip the bits
• 1CRepOf(A) + 1CRepOf(-A) = 2N-1_unsigned (interesting tidbit)
• Let’s assume a 4-bit representation (to make it easy to work with)
• Examples:
• 0011: 3
• 0110: 6
• 1001: -6 1111 – 0110 or just flip the bits of 0110
• 1111: -0 1111 – 0000 or just flip the bits of 0000
• 1000: -7 1111 – 0111 or just flip the bits of 0111
• Properties
– Two representations of zero
– Equal number of positive and negative numbers
11
Method 3: Two’s Complement
• (2N – number): To multiply a 2’s Complement number by -1,
subtract the number from 2N_unsigned. Or, equivalently (and
easily!), simply flip the bits and add 1.
• 2CRepOf(A) + 2CRepOf(-A) = 2N_unsigned (interesting tidbit)
• Let’s assume a 4-bit representation (to make it easy to work with)
• Examples:
• 0011: 3
• 0110: 6
• 1010: -6 10000 – 0110 or just flip the bits of 0110 and add 1
• 1111: -1 10000 – 0001 or just flip the bits of 0001 and add 1
• 1001: -7 10000 – 0111 or just flip the bits of 0111 and add 1
• 1000: -8 10000 – 1000 or just flip the bits of 1000 and add 1
• Properties
– One representation of zero: 0000
– An extra negative number: 1000 (this is -8, not -0)
12
Ranges of numbers
• Range (min to max) in N bits:
– SM and 1C: -2(N-1) -1 to +2(N-1) -1
– 2C: -2(N-1) to +2(N-1) -1
13
Sign Extension
• #s are often cast into vars with more capacity
• Sign extension (in 1c and 2c): extend the sign
bit to the left, and everything works out
• la $t0,0x00400033
• addi $t1,$t0, 7
• addi $t2,$t0, -7
• R[rt] = R[rs] + SignExtImm
• SignExtImm = {16{immediate[15]},immediate}
14
Summary
Code Sign-Magnitude 1’s Complement 2’s Complement
000 +0 +0 +0
001 +1 +1 +1
010 +2 +2 +2
011 +3 +3 +3
100 -0 -3 -4
101 -1 -2 -3
110 -2 -1 -2
111 -3 -0 -1
• Issues
– # of zeros
– Balance (and thus range)
– Operations’ implementation
15
2’s Complement Examples
• 32-bit signed numbers
– 0000 0000 0000 0000 0000 0000 0000 0000 = 0
– 0000 0000 0000 0000 0000 0000 0000 0001 = +1
– 0000 0000 0000 0000 0000 0000 0000 0010 = +2
– …
– 0111 1111 1111 1111 1111 1111 1111 1110 = +2,147,483,646
– 0111 1111 1111 1111 1111 1111 1111 1111 = +2,147,483,647
– 1000 0000 0000 0000 0000 0000 0000 0000 = - 2,147,483,648 -2^31
– 1000 0000 0000 0000 0000 0000 0000 0001 = - 2,147,483,647
– 1000 0000 0000 0000 0000 0000 0000 0010 = - 2,147,483,646
– …
– 1111 1111 1111 1111 1111 1111 1111 1101 = -3
– 1111 1111 1111 1111 1111 1111 1111 1110 = -2
– 1111 1111 1111 1111 1111 1111 1111 1111 = -1
16
Addition
• We can do binary addition
just as we do decimal
arithmetic
– Examples in lecture
21
Overflow with Unsigned Operations
23
1-bit Adder
• With a fully functional single-bit
adder
– We can build a wider adder by linking
many one-bit adders
• 3 inputs
– A: input A
– B: input B
– Cin: input C (carry in)
• 2 outputs
– S: sum
– Cout: carry out
24
Implementing an Adder
– Solve how S can be represented by way of A, B, and Cin
– Also solve for Cout
Input Output
A B Cin S Cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
25
Boolean Logic formulas
Input Output
A B Cin S Cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
• S = A’B’Cin+A’BCin’+AB’Cin’+ABCin
• Cout = AB+BCin+ACin
Can implement the adder using logic gates
26
Logic Gates
A
2-input AND Y Y=A&B
B
A
2-input OR Y Y=A|B
B
A
2-input NAND Y Y=~(A&B)
B
A
2-input NOR Y Y=~(A|B)
B
27
Implementation in logic gates
OR GATES
• Cout = AB+BCin+ACin
AND GATES
• We’ll see more boolean logic and circuit implementation when we get to
Appendix B
28
N-bit Adder
(0)
• 3 inputs
– A: N-bit input A
– B: N-bit input B
– Cin: input C (carry in)
• 2 outputs
– S: N-bit sum
– Cout: carry out
29
N-bit Ripple-Carry Adder
(0)
… 0
0
0
0
1
1
1
1
1
30