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;
next prev 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