[YLUG] Pointer help correction

Dominic Hibbs dominic.hibbs at gmail.com
Sun Jan 13 11:58:11 GMT 2008


POINTER HELP REQUESTED

My first posting had some errors - I am still not sure of the exact
structure I will be using.  I hope this is correct.

I am an assembly language programmer - I also program in many other
languages BUT, as many of you youngsters may not yet have learned, Knowledge
has a short shelf life and my C/C++ has been on the shelf too long.
In this - "long int" means 64 bit.

In assembly language there is no typing at all.  A 32 bit quantity may be
1. an integer,
2. a sixteen bit number followed by a byte with no defined value and a
    character,
3. half of a double,
4. four bytes of program.
5. a pointer to something,
6. or a pointer to a pointer
and it is up to the programmer how something is interpreted and what
alignment is used.

I am converting a program, written in assembler to C/C++ and I am stuck over
pointers.
This data structure is a linked list of variables.

A block of memory consists of records made up of

Byte No. Content
(0..3)     a 32 bit pointer to
                a long int (8 Byte)
                or a double
        or (32 bit pointer and two 16 bit integers)
(4..11) followed by a long int or Double
        or (32 bit pointer and two 16 bit integers)
(12..15)     followed by one byte made up of
        2 bits of flags, 4 bits of a number and two more bit flag
        followed by an ASCIZ string of 4 n + 3 bytes long (n = 0..30)

Bytes 12..15  are anded with  & 0x00 00 00 3c and then added to the address
of this record to get the next record.

First variable is a long int called "ten" and has the value 10 so the
first two bits of byte 12 have the value 0b01 and the record length is 20
bytes the other two bit flags have the value 0b01 (0 means Not an array
and the 1 bit says this variable has been initialised).

Abit of (obviously incorrect) code follows:

    char * s = "ten";
    void * blockaddr = malloc(varspace);  // Check return value for NULL
    recptr = blockaddr;       // get address of first record
    * recptr = * recptr + 4; // insert into memory at blockaddr
                                         // blockaddress + 4
    recptr += 12;              // pointer arithmetic point to byte 24

    * recptr = 1 | 20 | 0x80  // two bit flags | record length |
                                  // initialised as a byte value
    recptr++;
    *recptr++ = *s;      // recptr is a char *
    char ch;
    do {
               *recptr++ = ch = * (++ s);
    } while( ch);
    recptr +=3;               // align on four byte -
                                  // we are at the start of the next record.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.lug.org.uk/pipermail/york/attachments/20080113/3f336dff/attachment.html


More information about the York mailing list