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