comp.lang.ada
 help / color / mirror / Atom feed
* Help with Inline assembly
@ 2012-07-09  3:53 Jim C.
  2012-07-09  6:35 ` anon
  2012-07-09  8:41 ` theanalogmachine
  0 siblings, 2 replies; 6+ messages in thread
From: Jim C. @ 2012-07-09  3:53 UTC (permalink / raw)


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;



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-07-09 16:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
2012-07-09 15:05     ` Jeffrey Carter
2012-07-09 16:35       ` Jim C.

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