The trouble with assembly language is its built in obsolescence.<br><br><div><span class="gmail_quote">On 13/01/2008, <b class="gmail_sendername">Nicholas Thomas</b> &lt;<a href="mailto:nick@lupine.me.uk">nick@lupine.me.uk
</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Dominic Hibbs wrote:<br>&gt; POINTER HELP REQUESTED<br>&gt;<br>&gt; I am an assembly language programmer - I also program in many other
<br>&gt; languages BUT, as many of you youngsters may not yet have learned,<br>&gt; Knowledge has a short shelf life and my C/C++ has been on the shelf<br>&gt; too long.<br>&gt; In this - &quot;long int&quot; means 64 bit.
<br>&gt;<br>&gt; In assembly language there is no typing at all.&nbsp;&nbsp;A 32 bit quantity may be<br>&gt; 1. an integer,<br>&gt; 2. a sixteen bit number followed by a byte with no defined value and a<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; character,<br>&gt; 3. half of a double,
<br>&gt; 4. four bytes of program.<br>&gt; 5. a pointer to something,<br>&gt; 6. or a pointer to a pointer<br>&gt; and it is up to the programmer how something is interpreted and what<br>&gt; alignment is used.<br>&gt;<br>
&gt; I am converting a program, written in assembler to C/C++ and I am<br>&gt; stuck over pointers. This data structure is a linked list of variables.<br>&gt;<br>&gt; A block of memory consists of records made up of<br>&gt;
<br>&gt; Byte No. Content<br>&gt; (0..7)&nbsp;&nbsp;&nbsp;&nbsp; a 32 bit pointer to<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a long int (8 Byte)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or a double<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or (32 bit pointer and two 16 bit integers)<br>&gt; (8..15)&nbsp;&nbsp;&nbsp;&nbsp; followed by one byte made up of
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 bits of flags, 4 bits of a number and two more bit flag<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; followed by an ASCIZ string of 4 n + 3 bytes long (n = 0..30)<br>&gt; (16..23) followed by a long int or Double<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or (32 bit pointer and two 16 bit integers)
<br>&gt;<br>&gt; Bits 8..15 are anded with&nbsp;&nbsp;&amp; 0x00 00 00 3c and then added to the<br>&gt; address of this record to get the next record.<br>&gt;<br>&gt; First variable is a long int called &quot;ten&quot; and has the value 10 so the
<br>&gt; first two bits of byte 8 hav the value 0b01 and the record length is 20<br>&gt; bytes the other two bit flags have the value 0b01 (0 means Not an array<br>&gt; and the 1 bit says this variable has been initialised).
<br>&gt;<br>&gt; Abit of (obviously incorrect) code follows:<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; char * s = &quot;ten&quot;;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; void * blockaddr = malloc(varspace);&nbsp;&nbsp;// Check return value for NULL<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; recptr = blockaddr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get address of first record
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; * recptr = * recptr + 16; // insert into memory at blockaddr<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // blockaddress + 16<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; recptr += 8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pointer arithmetic point to byte 8<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; * recptr = 1 | 20 | 0x80&nbsp;&nbsp;// two bit flags | record length |
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // initialised as a byte value<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; recptr++;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; *recptr++ = *s;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// recptr is a char *<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; char ch;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; do {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*recptr++ = ch = * (++ s);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; } while( ch);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; recptr +=3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // align on four byte -<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // we are at the start of the next<br>&gt; record.<br>&gt;<br>&gt;<br>Urgh. Ouch. Eeep. Tell me, is there any particular reason you need to
<br>emulate the program&#39;s memory allocation behaviour so precisely? If this<br>were me, I&#39;d be looking at using (probably) std::list, containing either<br>a (fairly) simple class or a struct/union thingy (which I haven&#39;t used
<br>for ages). Trying to literally convert an ASM program to C/C++ sounds<br>like a lesson in pain (why not just use asm { ... } in that case? ;) ).<br><br>Also, you can&#39;t guarantee that long int is 64 bits. As an example:
<br>&lt;lupine_85&gt; geordi: {long int i; cout &lt;&lt; sizeof(i); }<br>&lt;geordi&gt; 4<br>&lt;lupine_85&gt; geordi: {long long i; cout &lt;&lt; sizeof(i); }<br>&lt;geordi&gt; ISO C++ does not support &#39;long long&#39;
<br>&lt;lupine_85&gt; geordi: {long long int i; cout &lt;&lt; sizeof(i); }<br>&lt;geordi&gt; ISO C++ does not support &#39;long long&#39;<br><br>If you have &lt;stdint.h&gt;, you can use uint64_t (or int64_t) instead.<br>
<br>/Nick<br><br><br>_______________________________________________<br>York mailing list<br><a href="mailto:York@lists.lug.org.uk">York@lists.lug.org.uk</a><br><a href="https://mailman.lug.org.uk/mailman/listinfo/york">https://mailman.lug.org.uk/mailman/listinfo/york
</a><br></blockquote></div><br>