Page 1 of 1
DJGPP Inline Help
Posted: Thu Dec 04, 2008 8:57 pm
by jake12
What is the format for DJGPP?
Code: Select all
__asm__ __volatile("movl %%cr0, %%eax":"=a"(cr0))::"eax");
When I try to compile my source this line causes an error:
test.c:57: error: expected ';' before ':' token
It looks right to me, but I am no guru. thanks
Re: DJGPP Inline Help
Posted: Thu Dec 04, 2008 10:38 pm
by Troy Martin
I think DJGPP takes Intel-syntax assembly.
Re: DJGPP Inline Help
Posted: Fri Dec 05, 2008 12:23 am
by jake12
Thoughts so. I am new to this inline asm using DJGPP, any chance you might show me how to structure that inline code I posted above. I am trying to store a copy of the cr0 register in the cr0 variable (not shown). thanks
Re: DJGPP Inline Help
Posted: Fri Dec 05, 2008 4:22 am
by Combuster
its not that - you have a closing brace too much in the middle.
And as long as you haven't told gcc to use something other than AT&T syntax, it will expect AT&T syntax.
Re: DJGPP Inline Help
Posted: Fri Dec 05, 2008 7:26 pm
by Troy Martin
Combuster wrote:And as long as you haven't told gcc to use something other than AT&T syntax, it will expect AT&T syntax.
Really? I'd assume a DOS/Win port of gcc would expect Intel syntax.
Re: DJGPP Inline Help
Posted: Fri Dec 05, 2008 8:10 pm
by Zenith
Well, the point of AT&T syntax was to "standardize" assembly syntax throughout platforms.
GCC will expect AT&T syntax on EVERY platform it is compiled for, unless specified differently...
Re: DJGPP Inline Help
Posted: Sat Dec 06, 2008 4:16 pm
by jake12
I pulled that line right out of the wiki, the code is used for probing for RAM. The link is
Detecting Memory. So, I took out the extra parenthesis and it worked but now it faults on this line:
Code: Select all
__asm__ __volatile__("movl %%eax, %%cr0", :: "a" (cr0 | 0x00000001 | 0x40000000 | 0x20000000) : "eax");
It says:
test.c:66: error: expected ':' or ')' before ',' token
If I remove that comma it faults saying:
test.c:95: error: can't find a register in class 'AREG' while reloading 'asm'
test.c:58: error: 'asm' operand has impossible constraints
Here is the entire code, after all changes described above have been made:
Code: Select all
unsigned int mem_end;
unsigned int bse_end;
void count_memory(void)
{
register unsigned long *mem;
unsigned long mem_count, a;
unsigned short memkb;
unsigned char irq1, irq2;
unsigned long cr0;
/* save IRQ's */
irq1=inb(0x21);
irq2=inb(0xA1);
/* kill all irq's */
outb(0x21, 0xFF);
outb(0xA1, 0xFF);
mem_count=0;
memkb=0;
// store a copy of CR0
__asm__ __volatile("movl %%cr0, %%eax":"=a"(cr0)::"eax");
// invalidate the cache
// write-back and invalidate the cache
__asm__ __volatile__ ("wbinvd");
// plug cr0 with just PE/CD/NW
// cache disable(486+), no-writeback(486+), 32bit mode(386+)
__asm__ __volatile__("movl %%eax, %%cr0" :: "a" (cr0 | 0x00000001 | 0x40000000 | 0x20000000) : "eax");
do
{
memkb++;
mem_count+=1024*1024;
mem=(unsigned long*)mem_count;
a=*mem;
*mem=0x55AA55AA;
// the empty asm calls tell gcc not to rely on whats in its registers
// as saved variables (this gets us around GCC optimisations)
asm("":::"memory");
if(*mem!=0x55AA55AA)
mem_count=0;
else
{
*mem=0xAA55AA55;
asm("":::"memory");
if(*mem!=0xAA55AA55)
mem_count=0;
}
asm("":::"memory");
*mem=a;
}while(memkb<4096 && mem_count!=0);
__asm__ __volatile__("movl %%eax, %%cr0" :: "a" (cr0) : "eax");
mem_end=memkb<<20;
mem=(unsigned long*)0x413;
bse_end=((*mem)&0xFFFF)<<6;
outb(0x21, irq1);
outb(0xA1, irq2);
}
Re: DJGPP Inline Help
Posted: Sun Dec 07, 2008 10:00 pm
by jake12
fixed. take out eax in clobber list. update the wiki.