comp.lang.ada
 help / color / mirror / Atom feed
From: theanalogmachine@gmail.com
Subject: Re: Help with Inline assembly
Date: Mon, 9 Jul 2012 01:41:23 -0700 (PDT)
Date: 2012-07-09T01:41:23-07:00	[thread overview]
Message-ID: <f59c0117-84e7-4648-beb9-6f39f448f0d9@googlegroups.com> (raw)
In-Reply-To: <85b57cc7-352e-4cee-a161-b0aaf1665305@googlegroups.com>

Thanks for the reply, it seems your suggestion did not fix my primary problem (that a EXCEPTION_ACCESS_VIOLATION is displayed at runtime). Could you elaborate more on your suggestion?

On Sunday, July 8, 2012 11:53:05 PM UTC-4, Jim C. wrote:
> I am running into problems translating Intel style visual C inline assembly to something gnat can understand (http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Inline-Assembler.html#Inline-Assembler). The goal of the program is to test for the existence of the CPUID command which only exists after the 386.
> 
> The program as it stands compiles without any errors, but it will fail at runtime with the following printed: "raised PROGRAM_ERROR : EXCEPTION_ACCESS_VIOLATION" -- I can't tell if I am violating syntax or something more complicated is involved.
> 
> ///////////////////////////////////// Visual C code
> static bool HasCPUID( void ) {
>   __asm 
>   {
>       pushfd                // save eflags
>       pop   eax
>       test  eax, 0x00200000 // check ID bit
>       jz    set21           // bit 21 is not set, so jump to set_21
>       and   eax, 0xffdfffff // clear bit 21
>       push  eax             // save new value in register
>       popfd                 // store new value in flags
>       pushfd
>       pop   eax
>       test  eax, 0x00200000 // check ID bit
>       jz    good
>       jmp   err             // cpuid not supported
>     set21:
>       or    eax, 0x00200000 // set ID bit
>       push  eax             // store new value
>       popfd                 // store new value in EFLAGS
>       pushfd
>       pop   eax
>       test  eax, 0x00200000 // if bit 21 is on
>       jnz   good
>       jmp   err
>   }
>   err:
>     return false;
>   good:
>     return true;
> }
> 
> --------------------------------------- Ada code
> with
>   Ada.Text_IO,
>   Interfaces,
>   System.Machine_Code;
> use
>   Ada.Text_IO,
>   Interfaces,
>   System.Machine_Code;
> procedure Assembly_Test
>   is
>   C      : Character   := Ascii.Nul;
>   Result : Unsigned_32 := 0;
>   begin
>     Asm(
>       -------------------------------------------------------
>       "   pushf                     " & Ascii.LF & Ascii.HT &
>       "   pop    %%eax              " & Ascii.LF & Ascii.HT & 
>       "   test   %%eax,  0x00200000 " & Ascii.LF & Ascii.HT &
>       "   jz     set21              " & Ascii.LF & Ascii.HT &
>       "   and    %%eax,  0xffdfffff " & Ascii.LF & Ascii.HT &
>       "   push   %%eax              " & Ascii.LF & Ascii.HT &
>       "   popf                      " & Ascii.LF & Ascii.HT &
>       "   pushf                     " & Ascii.LF & Ascii.HT & 
>       "   pop    %%eax              " & Ascii.LF & Ascii.HT & 
>       "   test   %%eax,  0x00200000 " & Ascii.LF & Ascii.HT &
>       "   jz     good               " & Ascii.LF & Ascii.HT & 
>       "   jmp    err                " & Ascii.LF & Ascii.HT &
>       -------------------------------------------------------
>       " set21:                      " & Ascii.LF & Ascii.HT & 
>       "   or     %%eax,  0x00200000 " & Ascii.LF & Ascii.HT &
>       "   push   %%eax              " & Ascii.LF & Ascii.HT &
>       "   popf                      " & Ascii.LF & Ascii.HT &
>       "   pushf                     " & Ascii.LF & Ascii.HT & 
>       "   pop    %%eax              " & Ascii.LF & Ascii.HT & 
>       "   test   %%eax,  0x00200000 " & Ascii.LF & Ascii.HT &
>       "   jnz    good               " & Ascii.LF & Ascii.HT & 
>       "   jmp    err                " & Ascii.LF & Ascii.HT &  
>       -------------------------------------------------------
>       " err:                        " & Ascii.LF & Ascii.HT & 
>       "   mov    0x0,    %%eax      " & Ascii.LF & Ascii.HT & 
>       -------------------------------------------------------
>       " good:                       " & Ascii.LF & Ascii.HT & 
>       "   mov    0x1,    %%eax      " & Ascii.LF & Ascii.HT , 
>       -------------------------------------------------------
>       Outputs  => Unsigned_32'Asm_Output("=a", Result),
>       Volatile => True);
>     if Result /= 1 then
>       Put_Line("False");
>     end if;
>     Put_Line("True");
>     Get(C);
>   end Assembly_Test;



  parent reply	other threads:[~2012-07-09  9:24 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-09  3:53 Help with Inline assembly Jim C.
2012-07-09  6:35 ` anon
2012-07-09  8:41 ` theanalogmachine [this message]
2012-07-09 14:43   ` theanalogmachine
2012-07-09 15:05     ` Jeffrey Carter
2012-07-09 16:35       ` Jim C.
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox