Q41531: How to Calculate Absolute Address; DEF SEG and PEEK Example
Article: Q41531 Product(s): See article Version(s): 4.00 4.00b 4.50 Operating System(s): MS-DOS Keyword(s): ENDUSER | B_BASICCOM SR# S890216-196 | mspl13_basic Last Modified: 18-APR-1989 The DEF SEG statement in BASIC sets the current segment address for a subsequent PEEK function, or a subsequent POKE, BLOAD, BSAVE, or CALL ABSOLUTE statement. PEEK, POKE, BLOAD, BSAVE, and CALL ABSOLUTE can all specify an offset (from the current segment) as an argument. You can calculate the absolute address (the n'th byte) in memory from the segment and offset as follows: 1. Multiply the segment address by 16 (or shift the hexadecimal representation 1 to the left, adding zero to the right-most digit; for example, &H40 times 16 equals &H400). 2. Add this value to the offset. In the 8086 chip architecture, the addressable memory space is divided into segments, each of which can contain up to 64K of memory. Segments can only start on a paragraph address. A paragraph address is a byte location that is evenly divisible by 16 bytes. Every 16th byte in memory contains segment number n. To access specific bytes or words in memory, you must use an offset relative to the beginning of a specified segment. Together, a segment and an offset provide a segmented address that can locate any byte in the 1 megabyte of address space in the 8086 processor. The following PEEK function returns 1 byte located at an offset from the paragraph address of the current segment: DEF SEG=paddress ' Sets paragraph address of "current" segment x% = PEEK(offset) ' A byte is returned in integer variable x% The following book contains more information about 8086-segmented architecture and memory addressing: "The New Peter Norton Programmer's Guide to the IBM PC & PS/2," by Peter Norton and Richard Wilton (published by Microsoft Press, 1988). Example 1 The following two PEEK functions access the same location in memory starting from two different segments (using decimal notation): DEF SEG = 0 x% = PEEK(256) 'PEEKs at address 0000:0256 decimal print x% DEF SEG = 1 'The next segment is 16 bytes higher. y% = PEEK(240) 'PEEKs at address 0001:0240 decimal print y% The previous lines of code print the same PEEKed value because (0 * 16) + 256 equals (1 * 16) + 240. Example 2 The following is another example of two PEEK functions accessing the same location in memory starting from two different segments, this time using hexadecimal notation: DEF SEG = 0 x% = PEEK(&H417) 'PEEKs at address 0000:0417 Hexadecimal print x% DEF SEG = &H40 y% = PEEK(&H17) 'PEEKs at address 0040:0017 Hexadecimal print x% The previous lines of code accesses the same values and prints them because they have the same absolute address: (0 hex + 417 hex) equals (400 hex + 17 hex). Remember, when you calculate the absolute address, you shift the segment address 1 digit to the left in hexadecimal notation (i.e., multiply by 16 decimal, or 10 hex) and then add to the offset: 40 hex times 10 hex equals 400 hex, which is added to 17 Hex.
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.