From: "Jim C." <theanalogmachine@gmail.com>
Subject: Help with Inline assembly
Date: Sun, 8 Jul 2012 20:53:05 -0700 (PDT)
Date: 2012-07-08T20:53:05-07:00 [thread overview]
Message-ID: <85b57cc7-352e-4cee-a161-b0aaf1665305@googlegroups.com> (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;
next reply other threads:[~2012-07-09 3:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-09 3:53 Jim C. [this message]
2012-07-09 6:35 ` Help with Inline assembly 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.
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox