ID:HX Hexadecimal Numbers and QEMM Quarterdeck Technical Note #190 by Vernon Balbert Q: Why are these numbers mixed up with these letters and what do they mean? A: These numbers and letters are part of a numbering system that is used by computers. Computers don't count the way people do. People use decimal, or base 10 for counting and we use the numbers 0-9 giving us 10 different symbols for counting. Computers, on the other hand, use binary, a number system that uses just zeros and ones. So, a typical binary number might look like this: 1001011011010010 Kind of confusing, huh? Well, even to programmers, these numbers are confusing. People just don't work well with binary. Computers do. Binary numbers can be translated to decimal quite easily, but they just aren't neat. For instance, if you use an eight digit binary number, you can count up to 255. Well, this has three decimal numbers and multiples of 256 (counting 0) is just not very neat or easy. However, there is a different way of counting that is widely used by computer people. This is called HEXADECIMAL. Hexadecimal is base 16. What this means is that if you were to start counting from 0, you would continue up to some single digit that would represent 15. And that's where the letters come from. Hexadecimal numbers go like this: 0 1 2 3 4 5 6 7 8 9 A B C D E F Well, part of that looks normal, at least until the 9. The A translates as 10, the B as 11 on up until the F is equal to 15. After F, you tack on a 1 at the beginning of the number just like we do so you would get 10. And, yes, 10 plus 10 equal 20. Since 10 in hexa- decimal is equal to 16 in decimal, it would be logical to assume that if 16+16=32 then 20 hexadecimal equals 32 decimal. Rest assured, it does. Often, to tell the difference between hexadecimal and decimal numbers, programmers will use H at the end of the number to say that it is hexadecimal, i.e. 10H. Now, if you have 8 binary numbers, you can count either to 256, or to FFH. (Remember, the H stands for hexadecimal.) This means that you can count in multiples of 4 binary digits with one hexadecimal digit. For instance: 10010110=96H=150 base 10 Now, you might ask, why use multiples of 4 binary digits? Well, the answer is really quite simple. Computer people like to group binary numbers in groups of eight. A hexadecimal number can represent 4 binary digits. Each number is called a bit and each group of eight bits is a byte. And computer memory is measured in bytes. Each byte can represent one character such as the letter "Q" or the number "3". Your hard disk is measured in megabytes, or millions of bytes. So, hexadecimal is a number system that both computers and humans can work with easily. Actually, computers don't work with hexadecimal, but most programs that work with hexadecimal numbers have routines that translate the hexadecimal numbers to binary for the computer because it's so easy; simply convert each hex digit into the appropriate 4 binary digits. By the way, hexadecimal is often referred to as "hex" for short. Okay, now we have to delve a little into the history of IBM PCs to understand the way you address memory. When IBM first came out with the PC, the Intel 8088 processor was used. The 8088 can access 1 megabyte of memory. However, the chip only has 16 bit registers. (A register is an internal memory loca- tion.) You can only count to 65535 with 16 bits. In order to access the 20 bits outside the microprocessor, an alternate method of ad- dressing memory was developed. So, addresses had the following format: ssss:oooo The first four hex digits (ssss) are the segment address. The last four (oooo) are the offset address. Together, these can address the entire 1 megabyte space of the 8088. This is called relative addressing. You never actually say the exact address that you are pointing at, just an address relative to a different position. For instance, if you have an address such as 1234:2319, you would take 1234H, add a 0 to the end so it turns into 12340H and then add 2319H to it to get 14659H. When the 80286 came out, it had 24 address lines to address more than the 1 megabyte of memory available. (24 address lines lets you address 16 megabytes of memory.) Additionally, the internal registers were enlarged to 24 bits so you didn't have to go through the segment and offset gyrations. So, you could now use absolute addressing. The address now takes this format: XXXXXX Notice now, that there are 6 digits instead of two sets of 4 when an 80286 is in "protected" mode (6 digit mode). DOS, unfortunately, only understands segmented memory addressing which is in "real" mode. Intel built in a "real" mode into the 80286 and higher processors so that they would still understand relative addressing. This difference is VERY important. It is the main reason that you can't use exTENDed memory (only available in "protected" mode) to run DOS programs (which require "real" mode). QEMM, QRAM and DESQview all observe the relative addressing scheme. So, when you include or exclude areas of memory with QEMM, you use the segment address. Typically, the only exclusions you will use involve the area above the 640K program space. This is a 384K area of memory that is normally used by adapter cards and ROMs in your computer. The address range of the lower 640K is 0000-9FFF. Remem-ber, these are the segment addresses, not the offset addresses. The area above 640K is the A000-FFFF range. Here is a translation table so you can convert some common hexadecimal addresses into decimal and back. Common way of Decimal Hexadecimal Segment:Offset saying it 1K 1024 400 0040:0000 or 0000:0400 2K 2048 800 0080:0000 or 0000:0800 4K 4096 1000 0100:0000 or 0000:1000 8K 8192 2000 0200:0000 or 0000:2000 16K 16384 4000 0400:0000 or 0000:4000 32K 32768 8000 0800:0000 or 0000:8000 64K 65536 10000 1000:0000 128K 131072 20000 2000:0000 256K 262144 40000 4000:0000 384K 393612 60000 6000:0000 512K 524288 80000 8000:0000 640K 655350 A0000 A000:0000 704K 720896 B0000 B000:0000 736K 753664 B8000 B800:0000 768K 786432 C0000 C000:0000 832K 851968 D0000 D000:0000 896K 917504 E0000 E000:0000 960K 983040 F0000 F000:0000 1024K 1048576 100000 1MB and beyond cannot be addressed with the segment:offset method. In summary, we see that hexadecimal (or hex, for short) is actually base 16, decimal is base 10 and binary is base 2. Hex numbers go from 0 to F, decimal numbers go from 0 to 9 and binary go from 0 to 1. Hex numbers are used to make it easier for people to work with numbers that the computer uses. Copyright (C) 1991 by Quarterdeck Office Systems * * * E N D O F F I L E * * *