On Sat, Jul 09, 2005 at 10:23:14PM +0200, Florian Michel wrote:
> 
> Hello,
> 
> I have a question concerning successfully assembling and linking the 
> following assembly program on a linux AMD 64 machine:
> 
> #cpuid2.s View the CPUID Vendor ID string using C library calls
> .section .datatext
> output:
>     .asciz "The processor Vendor ID is '%s'\n"
> .section .bss
>     .lcomm buffer, 12
> .section .text
> .globl main
> main:
>     movl $0, %eax
>     cpuid
>     movl $buffer, %edi
>     movl %ebx, (%edi)
>     movl %edx, 4(%edi)
>     movl %ecx, 8(%edi)
>     push $buffer
>     push $output
>     call printf
>     addl $8, %esp
>     push $0
>     call exit
> 
> This part of a book on assembly programming I am reading.
> 
> Compile and Link: gcc -o cpuid2 cpuid2.s
> When running cpuid2 it crashes with a segmentation fault.
> Which switches do I have to add to call gcc?
> 
> Thanks a lot!

If you are running on a Linux AMD 64 machine, the default compiler is 64 bit,
which uses a different calling sequence than the traditional 32-bit x86 world.
The above code however is 32 bit.  Use the -m32 option.

However, rather than write in assembler, you should use the asm extension to
get the asm code you need.  This works on both 32 and 64 bit modes:

        #include <stdio.h>

        int main(int argc, char *argv[])
        {
          int edx;
          int ebx;
          int ecx;
          union {
            int i[4];
            char c[16];
          } u;

          __asm__ ("cpuid"
                   : "=b" (ebx), "=d" (edx), "=c" (ecx)
                   : "a" (0));

          u.i[0] = ebx;
          u.i[1] = edx;
          u.i[2] = ecx;
          u.i[3] = 0;
          printf ("The processor Vendor ID is '%s'\n", u.c);
          return 0;
        }

-- 
Michael Meissner
email: [EMAIL PROTECTED]
http://www.the-meissners.org

Reply via email to