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