comp.lang.ada
 help / color / mirror / Atom feed
From: anon@att.net
Subject: Re: Help with Inline assembly
Date: Mon, 9 Jul 2012 06:35:29 +0000 (UTC)
Date: 2012-07-09T06:35:29+00:00	[thread overview]
Message-ID: <jtdu3f$dsq$1@speranza.aioe.org> (raw)
In-Reply-To: 85b57cc7-352e-4cee-a161-b0aaf1665305@googlegroups.com

alter code to look like this:

      -------------------------------------------------------
      " err:                        " & Ascii.LF & Ascii.HT &
      "   mov    0x0,    %%eax      " & Ascii.LF & Ascii.HT &
      "   jmp    ret                " & Ascii.LF & Ascii.HT &  -- added
      -------------------------------------------------------
      " good:                       " & Ascii.LF & Ascii.HT &
      "   mov    0x1,    %%eax      " & Ascii.LF & Ascii.HT &
      -------------------------------------------------------
      " ret:"                        ",                        -- added


remove the "-- added" comment


In <85b57cc7-352e-4cee-a161-b0aaf1665305@googlegroups.com>, "Jim C." <theanalogmachine@gmail.com> writes:
>I am running into problems translating Intel style visual C inline assembly=
> to something gnat can understand (http://gcc.gnu.org/onlinedocs/gnat_ugn_u=
>nw/Inline-Assembler.html#Inline-Assembler). The goal of the program is to t=
>est 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 r=
>untime with the following printed: "raised PROGRAM_ERROR : EXCEPTION_ACCESS=
>_VIOLATION" -- I can't tell if I am violating syntax or something more comp=
>licated is involved.
>
>///////////////////////////////////// Visual C code
>static bool HasCPUID( void ) {
>  __asm=20
>  {
>      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   :=3D Ascii.Nul;
>  Result : Unsigned_32 :=3D 0;
>  begin
>    Asm(
>      -------------------------------------------------------
>      "   pushf                     " & Ascii.LF & Ascii.HT &
>      "   pop    %%eax              " & Ascii.LF & Ascii.HT &=20
>      "   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 &=20
>      "   pop    %%eax              " & Ascii.LF & Ascii.HT &=20
>      "   test   %%eax,  0x00200000 " & Ascii.LF & Ascii.HT &
>      "   jz     good               " & Ascii.LF & Ascii.HT &=20
>      "   jmp    err                " & Ascii.LF & Ascii.HT &
>      -------------------------------------------------------
>      " set21:                      " & Ascii.LF & Ascii.HT &=20
>      "   or     %%eax,  0x00200000 " & Ascii.LF & Ascii.HT &
>      "   push   %%eax              " & Ascii.LF & Ascii.HT &
>      "   popf                      " & Ascii.LF & Ascii.HT &
>      "   pushf                     " & Ascii.LF & Ascii.HT &=20
>      "   pop    %%eax              " & Ascii.LF & Ascii.HT &=20
>      "   test   %%eax,  0x00200000 " & Ascii.LF & Ascii.HT &
>      "   jnz    good               " & Ascii.LF & Ascii.HT &=20
>      "   jmp    err                " & Ascii.LF & Ascii.HT & =20
>      -------------------------------------------------------
>      " err:                        " & Ascii.LF & Ascii.HT &=20
>      "   mov    0x0,    %%eax      " & Ascii.LF & Ascii.HT &=20
>      -------------------------------------------------------
>      " good:                       " & Ascii.LF & Ascii.HT &=20
>      "   mov    0x1,    %%eax      " & Ascii.LF & Ascii.HT ,=20
>      -------------------------------------------------------
>      Outputs  =3D> Unsigned_32'Asm_Output("=3Da", Result),
>      Volatile =3D> True);
>    if Result /=3D 1 then
>      Put_Line("False");
>    end if;
>    Put_Line("True");
>    Get(C);
>  end Assembly_Test;




  reply	other threads:[~2012-07-09  6:35 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 [this message]
2012-07-09  8:41 ` theanalogmachine
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