CIS 258 Assembly Language Programming - Lecture Notes Chapter 1 Data Representation and Computer Arithmetic Characters, Words, and Bytes Bit - The smallest quantity of information that can be stored and manipulated inside a computer, A bit can be in one of two states, on or off, 1 or 0, true or false. Byte - A group of 8 bits. Word - the basic unit of information stored in memory and processed by a computer. A word is a group of bits. The number of bits, or word size, varies from computer to computer. o An n-bit word can contain 2n unique bit patterns. A given bit pattern has no intrinsic meaning associated with it. The actual meaning of a particular pattern of bits is the meaning given to it by the programmer. Instruction (op-code) - An instruction or operation code defines an action to be performed by the CPU. A bit pattern is associated with each op-code by the CPU designer. Numeric Quantity - A word that is used to represent a number, Numbers may be represented in many formats. Character - A bit pattern used to represent a letter (A-Z or a-z) or any symbol from the keyboard. The most common scheme for coding characters is the ASCII code (American Standard Code for Information Interchange). ASCII Chart MSb --> | 0 1 2 3 4 5 6 7 | 000 001 010 011 100 101 110 111 _________ |_________________________________________ 0 0000 | NUL DLC SP 0 @ P ' p 1 0001 | SOH DC1 ! 1 A Q a q 2 0010 | STX DC2 " 2 B R b r 3 0011 | ETX DC3 # 3 C S c s 4 0100 | EOT DC4 $ 4 D T d t 5 0101 | ENQ NAK % 5 E U e u 6 0110 | ACK SYN & 6 F V f v 7 0111 | BEL ETB ' 7 G W g w 8 1000 | BS CAN ( 8 H X h x 9 1001 | HT EM ) 9 I Y i y A 1010 | LF SUB * : J Z j z B 1011 | VT ESC + ; K [ k { C 1100 | FF FS , < L \ l | D 1101 | CR GS = M ] m } E 1110 | SO RS . > N ^ n ~ F 1111 | SI US / ? O _ o DEL Picture Element - Part of a picture that has been digitally encoded, Many techniques exist for encoding pictures. The term pixel is derived from Picture Element. Analog Signal - A signal that varies over time and is not constrained to different levels, Music is an example of an analog signal. Before analog signals can be stored using binary digits they must first be converted into a digital form. An analog to digital converter (ADC) is a device that performs this conversion. See Fig 1-3. Number Bases Name of base Decimal Binary Octal Hexadecimal Base b = 10 b= 2 b= 8 b = 16 Set of digits a = {0,1,2,3,4,5,6,7,8,9} a = {0,1} a = {0,1,2,3,4,5,6,7} a = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} Number Base Conversion Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Binary 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F Decimal to Binary To convert a decimal integer to binary, divide the number successively by 2, and after each division, record the remainder which is either 1 or 0. The process is terminated only when the result of the division is 0 remainder 1. For example, 12310 becomes: 123 / 2 = 61 R = 1 61 / 2 = 30 R = 1 30 / 2 = 15 R = 0 15 / 2 = 7 R = 1 7 / 2 = 3 R = 1 3 / 2 = 1 R = 1 1 / 2 = 0 R = 1 The result is read from the most-significant bit (the last remainder) upward to give 12310 = 11110112. Decimal to Hexadecimal To convert a decimal integer to hexadecimal, divide the number successively by 16, and after each division, record the remainder which in the decimal range 0 to 15, corresponding to the hexadecimal range 0 to F. For example, 5324110 becomes: 53241 / 16 = 3327 R = 9 3327 / 16 = 207 R = 1510 = F16 207 / 16 = 12 R = 1510 = F16 12 / 16 = 0 R = 1210 = C16 Therefore, 5324110 = CFF916. Binary to Decimal For manual conversion of small binary numbers simply add together all the 1 bits weighted by the proper power of two. For example, 10101112 is represented by: 64 1 64 32 0 16 1 8 0 4 1 2 1 + 0 + 16 + 0 + 4 + 2 + 1 1 1 = 87 A better method to use when writing a program to perform the conversion is based on a recursive algorithm as follows: Take the left-most non-zero bit, double it, and add it to the bit on its right. Now take this result, double it, and add it to the next bit on the right. Continue in this way until the least-significant bit has been added in. For example, 10101112 becomes: 1 0 2+0 1 0 1 1 1 4+1=5 10+0=10 20+1=21 42+1=43 86+1=87 Therefore, 10101112 = 8710. Hexadecimal to Decimal This method is identical to the procedure for binary, except that 16 is used as a multiplier. For example, 1AC16 becomes: 1 A C *16 16+10=26 *16 416+12=428 Therefore, 1AC16 = 42810. Binary to Hexadecimal The binary number is formed into groups of four bits starting at the decimal point. Each group is replaced by a hexadecimal digit from 0 to 9, A, B, C, D, E, F. For example, 0110010111012 becomes 0110 6 0101 5 1101 D Therefore, 0110010111012 = 65D16. Hexadecimal to Binary Each hexadecimal digit is replaced by its four-bit binary equivalent. For example, AB4C16 becomes A 1010 B 1011 4 0100 C 1100 Therefore, AB4C16 = 10101011010011002. Converting Binary Fractions to Decimal Fractions The algorithm for converting binary fractions to their decimal equivalent is based on the fact that a bit in one column is worth half the value of a bit in the column on its left. Starting at the right-mist non-zero bit, take that bit and halve it. Now add the result to the next bit on its left. Halve this result and add it to the next bit on the left. Continue until the binary point is reached. For example, consider the conversion of 0.011012 into decimal form 0. 0 + 13/32 13/16 0 13/16 1 5/8 + 8/8 13/8 1 1/4 + 4/4 5/4 0 1/2 +0 1/2 1 Therefore, 0.011012 = 13/32 = 0.4062510. Converting Decimal Fractions to Binary Fractions The decimal fraction is multiplied by two and the integer part noted. The integer, which will be either 1 or 0, is then stripped from the number to leave a fractional part. The new fraction is multiplied by two and the integer part noted. Continue until the process ends, or a sufficient degree of precision has been achieved. The binary fraction is formed by reading the integer parts from the top to the bottom as the following example illustrates. For example, 0.687510 becomes: 0.6875 0.3750 0.7500 0.5000 0.0000 x x x x x 2 2 2 2 2 1.3750 0.7500 1.5000 1.0000 0.0000 ends the process Therefore, 0.687510 = 0.10112 Now the same process for 0.110 0.1000 x 2 0.2000 0.2000 x 2 0.4000 0.4000 x 2 0.8000 0.8000 x 2 1.6000 0.6000 x 2 1.2000 0.2000 x 2 0.4000 0.4000 x 2 0.8000 0.8000 x 2 1.6000 0.6000 x 2 1.2000 0.2000 x 2 0.4000 at this point the values start repeating Therefore, 0.100010 = 0.00011001102 to ten binary places. Because the values start repeating there is no exact representation of 0.110 in binary fractions. Counting in Hex Before moving on lets take another look at hexadecimal numbers and what they represent. The hex digits are: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Just as in the decimal system when we run out of digits to represent a value we start using more than one digit to represent the value. For example: if we are counting in decimal and we reach 9 the next quantity is represented by using two digits. In the decimal system that number is 10. The question is, if we are counting in hex and we reach F16, what is the next number? The answer is 1016. Don't confuse 1016 with 1010. When verbally reading the values, 1016 is read a "One Zero" not "Ten". The hex digits then continue 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21,… etc. 98, 99, 9A, 9B, 9C, 9D, 9E, 9F, A0, A1, … etc. EF, F0, F1, F2, F3, F4, F5, F6, F7, F8, F9, FA, FB, FC, FD, FE, FF, 100, 101,… etc. Hex values are often indicated by using a dollar sign '$', for example: 1016 is written as $10. They are also sometimes indicated by preceding them with '0x', for example 0x10. They may also be represented by a trailing 'h', for example: 10h. We must always use some means of indicating the base of a number because 1010 is not the same as 1016. Some handy hex values to know are: $10 = 16 $FF = 255 $100 = 256 $200 = 512 $400 $800 $1000 $FFFF = 1024 = 2048 = 4096 = 65535 Special Purpose Codes (BCD) BCD - Binary Coded Decimal BCD is a technique that can be used to encode decimal numbers. Each decimal digit is represented using four binary digits. Wait a minute, isn't that the same way that Hex digits are encoded into binary? Yes it is! What's the difference? The answer is, as far as encoding is concerned, there isn't any difference. Let's look at an example that encodes two numbers. One is a hex value that is encoded into binary and the other is a decimal value that is encoded into BCD. 987616 = 1001 1000 0111 01102 987610 = 1001 1000 0111 0110BCD Remember, the way values are represented in the computer is entirely up to the programmer. There is in fact no difference between the way the previous two values are represented in binary. The difference is in how the programmer deals with the binary values. Most microprocessors have special instructions for working with BCD values. We will take a closer look at BCD numbers later. The main disadvantage of using BCD numbers is their inefficient use of storage. With four binary digits we could represent decimal numbers from 0 15 however in BCD we only represent digits 0 9. This means a 16 bit BCD number can represent decimal values 0 9999 whereas a 16 bit binary number can represent decimal values 0 65535. Binary Arithmetic Table 1.5 The binary tables ADDITION SUBTRACTION MULTIPLICATION 0 0 1 1 0 0 1 1 0 0 1 1 + + + + 0 1 0 1 = = = = 0 1 1 0 carry 1 - 0 1 0 1 = = = = 0 1 borrow 1 1 0 Binary addition 00110111 +01010110 111 11 -------10001101 55 +86 carries ---141 x x x x 0 1 0 1 = = = = 0 0 0 1 Hexadecimal addition 9A345 6701B 11 1 -----101360 carries Binary subtraction 01010110 -00101010 1 1 -------00101100 86 -42 borrows ---44 Signed Numbers Sign and Magnitude Representation An 8 bit binary number can represent 256 different decimal numbers 0…255. One way of representing negative numbers is to use the most-significant bit as a sign bit. Usually 0 indicates a positive number and 1 indicates a negative number. Using this technique: 0 0001101 = +13 | |-sign bit 1 0001101 = -13 | |- sign bit One side effect of this method is that it yields two representations of zero: 00000000 = +0 and 10000000 = -0 Complementary Arithmetic In complementary arithmetic negative numbers are represented by their complement. The complement of an n-digit decimal number, N, is defined as 10n - N. The 10's complement may also be calculated by subtracting each of the digits of N from 9 and adding 1 to the result. For example the 10's complement of 1234 is: 104 - 1234 = 8766 or 9999 -1234 ---8765 + 1 = 8766 8766 is the 10's complement of 1234. Adding the complement of a number is very similar to the result obtained by subtracting the original value. For example 8576 + 8766 -----17342 8576 - 1234 -----7342 The results are identical in the least-significant four digits. Two's Complement Representation To calculate the two's complement of a binary number we simply invert all of the bits and add 1. For example, the two's complement of 0011 1001 is 1100 0110 + 1 = 1100 0111. Adding the two's complement of a binary number to another number has the same effect as subtracting the original value, provided we ignore the most significant bit of the result. 9 +6 15 01001 +00110 01111 9 -6 3 01001 +11010 100011 -9 +6 -3 10111 +00110 11101 -9 -6 -15 10111 +11010 110001 Note, that all results are in two's complement form. Properties of Two's Complement Numbers There is one unique zero, 00…0 If the number is positive the most-significant bit, MSB, is 0, and if it is negative the MSB is 1. Thus, the MSB is a sine bit. The range of two's complement numbers in n bits is from -2(n-1) to +2(n-1) - 1. The complement of the complement of X is X. (i.e., -(-X) = X. Arithmetic Overflow When performing two's complement arithmetic it is possible to obtain results that are unexpected if the resulting value is too large or small for the given number of bits. 12 +13 25 01100 +01101 11001 = -710 (as a two's complement number) Floating Point Numbers Representation of Fixed Point Numbers Case 1 Integer arithmetic 7632135 + 1794821 9426956 Case 2 Fixed-point arithmetic 763.2135 + 179.4821 942.6956 There is no difference between the calculations in the previous two examples. The same is true for binary arithmetic. All the computer programmer has to do is remember where the binary point is assumed to lie. All input to the computer is called to match this convention and all output is similarly scaled. The internal operations themselves are carried out as if the numbers were in integer form. For example, assume an 8-bit fixed point binary number, the most-significant four bits represent the integer part and the least-significant four bits represent the decimal part. We want to add 3.625 and 6.5. 3.62510 6.510 0011.10102 0110.10002 Each of these values is treated as an integer and the addition is performed. 00110101 + 01101000 101000102 1010.00102 10.12510 The resulting integer is separated into its integer and decimal parts yielding the correct answer. The advantage of using fixed-point numbers is that no complex software or hardware is needed to implement it. A limitation of using fixed-point numbers is that working with very large or very small values requires many bytes of storage, most of which goes unused. Representation of Floating Point Numbers The decimal number 1234.56 may be written as 0.123456 x 104. Binary numbers may also be written using the same technique. For example, 1101101.11011012 may be written as 0.11011011101101 x 27 where the 7 is also stored in binary format. Range - How big or how small the number can be. The range is determined by the number of bits used to represent the exponent. Precision - How many digits can be accurately represented. Precision is determined by the number of bits used to represent the mantissa. Normalization of Floating Point Numbers The floating point mantissa is always normalized so that it is expressed in the form 0.1 … x 2e. By normalizing a mantissa, the greatest advantage is taken of the available precision. For example: the binary number 0.000010100011 has eight significant bits, storing it with an un-normalized 8-bit mantissa 0.00001010 reduces it to just four significant bits, while using a normalized 8-bit mantissa 0.10100011 x 2-4 keeps eight significant bits. Biased Exponents Floating point representations of numbers must make provision for both positive and negative numbers, and positive and negative exponents. The exponent is usually represented in a biased form. For example: Assume we wish to represent an exponent by using three bits. The possible range of numbers would be 0,1,2,3,4,5,6,7. When biased exponents are used a bias value is picked that divides the range of values in half. In our example this value would be 4. This bias number is then added to each exponent before it is represented in binary. If the original exponent is -4 then adding the bias value of 4 yields 0. The new range of exponents we can represent in three bits with a bias value of four is -4,-3,-2,-1,0,1,2,3. Original -4 -3 -2 -1 0 1 2 3 + + + + + + + + Bias 4 4 4 4 4 4 4 4 = = = = = = = = Result 0 1 2 3 4 5 6 7 Binary 000 001 010 011 100 101 110 111 With biased exponents, the most negative exponent is represented by zero. IEEE Floating Point Format The Institute of Electrical and Electronics Engineers (IEEE) has produced a standard floating point format. IEEE floating point numbers are normalized so that their mantissas always have an integer part of 1. That is, all IEEE floating point binary numbers are in the range 1.0 <= mantissa < 2.0. An IEEE format floating point number X is defined as: X = -1S x 2E-B X 1.F where: S = sign bit: 0 = positive mantissa, 1 = negative mantissa E = exponent biased by B F = fractional mantissa Since the normalized mantissa always contains a 1 in the integer part, there is not need to store it. In this way a bit of storage can be saved, permitting the precision of the mantissa to be extended by one bit. The following is an example of the use of the IEEE 32-bit format to store the decimal number -2345.125 on a machine having a 16-bit word length. -2345.12510 = -100100101001.0012 (as an equivalent binary number) 11 = -1.00100101001001 x 2 (normalized binary number) The mantissa is negative, so the sign bit S is 1. The biased exponent is given by +11 + 127 = 138 = 100010102. The fractional part of the mantissa is .00100101001001000000000 (in 23 bits). Therefore, the IEEE single format representation of -2345.125 is: 1 10001010 00100101001001000000000 A 32-bit computer would store this number as two consecutive 16-bit words: 1100010100010010 1001001000000000 Table 1.7 Basic IEEE floating point formats Type Single Double Quad Field width in bits S = sign E = exponent L = leading bit F = fraction Total width 1 8 1 23 32 1 11 1 52 64 1 15 1 111 128 Exponent Maximum exponent Minimum exponent Bias 255 0 127 2047 0 1023 32767 0 16383 Normalized numbers (all formats) Range of exponents: Represented number: (Min E = 1) to (Max E - 1) -1S x 2 E-bias x L.F A signed zero is represented by the minimum exponent, L = 0, and F = 0, for all three formats. The maximum exponent has a special function and is used to represent signed infinity for all three formats. Floating Point Arithmetic Addition and Subtraction Floating point numbers may only be added or subtracted when they have the same exponent. To perform a floating point addition/subtraction the following steps must be carried out: 1. Identify the number with the smaller exponent. 2. Make the smaller exponent equal to the larger by dividing the mantissa of the smaller number by the same factor by which its exponent was increased. 3. Add (or subtract) the mantissas. 4. If necessary, normalize the result (post-normalization). Logical Operations on Binary Values x 0 0 1 1 AND y 0 1 0 1 x AND y 0 0 0 1 x 0 0 1 1 XOR y 0 1 0 1 x EOR y 0 1 1 0 x 0 0 1 1 OR y 0 1 0 1 x OR y 0 1 1 1 NOT x NOT x 0 1 1 0 Examples: AND x = 11010110 y = 11110000 x&y = 11010000 The AND operation acts like a mask and can be used to force one or more bits of a word to zero. x = 00010110 y = 11000000 x|y = 11010110 The OR operation can be used to force one or more bits of a word to ones. OR EOR x = y = x y = 11010110 01100111 10110001