comp.lang.ada
 help / color / mirror / Atom feed
From: theanalogmachine@gmail.com
Subject: Re: Help with Inline assembly
Date: Mon, 9 Jul 2012 07:43:56 -0700 (PDT)
Date: 2012-07-09T07:43:56-07:00	[thread overview]
Message-ID: <024cf9df-ad12-4476-a14d-eb99def28b77@googlegroups.com> (raw)
In-Reply-To: <f59c0117-84e7-4648-beb9-6f39f448f0d9@googlegroups.com>

I now have the program executing, and potentially functioning -- I won't know for sure until I test it with some sort of emulator that simulates older processors. Here is the fixed code for anyone interested (this came in handy too http://x86asm.net/articles/what-i-dislike-about-gas/)

  -----------------------
  -- Can_Execute_CPUID --
  -----------------------
    function Can_Execute_CPUID
      return Boolean
      is
      Result : Unsigned_32 := 0;
      begin
        Asm(
          --------------------------------------------------------
          " begin:                       " & Ascii.LF & Ascii.HT &
          "   pushfl                     " & Ascii.LF & Ascii.HT &
          "   popl   %%eax               " & Ascii.LF & Ascii.HT & 
          "   test   $0x00200000, %%eax  " & Ascii.LF & Ascii.HT &
          "   jz     set21               " & Ascii.LF & Ascii.HT &
          "   and    $0xffdfffff, %%eax  " & Ascii.LF & Ascii.HT &
          "   pushl  %%eax               " & Ascii.LF & Ascii.HT &
          "   popfl                      " & Ascii.LF & Ascii.HT &
          "   pushfl                     " & Ascii.LF & Ascii.HT & 
          "   popl   %%eax               " & Ascii.LF & Ascii.HT & 
          "   test   $0x00200000, %%eax  " & Ascii.LF & Ascii.HT &
          "   jz     good                " & Ascii.LF & Ascii.HT & 
          "   jmp    error               " & Ascii.LF & Ascii.HT &
          --------------------------------------------------------
          " set21:                       " & Ascii.LF & Ascii.HT & 
          "   or     $0x00200000, %%eax  " & Ascii.LF & Ascii.HT &
          "   pushl  %%eax               " & Ascii.LF & Ascii.HT &
          "   popfl                      " & Ascii.LF & Ascii.HT &
          "   pushfl                     " & Ascii.LF & Ascii.HT & 
          "   popl   %%eax               " & Ascii.LF & Ascii.HT & 
          "   test   $0x00200000, %%eax  " & Ascii.LF & Ascii.HT &
          "   jnz    good                " & Ascii.LF & Ascii.HT & 
          "   jmp    error               " & Ascii.LF & Ascii.HT &  
          --------------------------------------------------------
          " error:                       " & Ascii.LF & Ascii.HT & 
          "   movl   $0x0,        %%eax  " & Ascii.LF & Ascii.HT & 
          "   jmp    end                 " & Ascii.LF & Ascii.HT &
          --------------------------------------------------------
          " good:                        " & Ascii.LF & Ascii.HT & 
          "   movl   $0x1,        %%eax  " & Ascii.LF & Ascii.HT &
          --------------------------------------------------------
          " end:                         " & Ascii.LF & Ascii.HT , 
          --------------------------------------------------------
          Outputs  => Unsigned_32'Asm_Output("=a", Result),
          Volatile => True);
        if Result /= 1 then
          return True;
        end if;
        return False;
      end Can_Execute_CPUID;

On Monday, July 9, 2012 4:41:23 AM UTC-4, (unknown) wrote:
> 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;



  reply	other threads:[~2012-07-09 14:57 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
2012-07-09 14:43   ` theanalogmachine [this message]
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