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