Macos 使用printf的IA-32组件cpuid

Macos 使用printf的IA-32组件cpuid,macos,assembly,x86,Macos,Assembly,X86,我正试图在Mac OS X Montain Lion上学习专业的汇编语言。 在google上,我在以下url找到了Mac OS X的端口: 用Vim创建文件并用GAS编译: as-g-arch i386-o cpuid.o cpuid.s 使用gcc链接代码: gcc-m32-arch i386-o cpuid cpuid.o 生成的可执行cpuid运行时没有错误,但如果我尝试在最后用gdb调试它,它会说程序以代码044退出,而不是程序正常退出 为了找到正确退出的方法,我用C创建了一个hello

我正试图在Mac OS X Montain Lion上学习专业的汇编语言。 在google上,我在以下url找到了Mac OS X的端口:

用Vim创建文件并用GAS编译: as-g-arch i386-o cpuid.o cpuid.s 使用gcc链接代码: gcc-m32-arch i386-o cpuid cpuid.o

生成的可执行cpuid运行时没有错误,但如果我尝试在最后用gdb调试它,它会说程序以代码044退出,而不是程序正常退出

为了找到正确退出的方法,我用C创建了一个hello world示例,并用它生成了汇编代码: gcc-Wall-03-m32-fno PIC hello_pf.c-S-o hello_pf.S 生成的装配代码如下所示:


.section        __TEXT,__text,regular,pure_instructions
        .globl  _main
        .align  4, 0x90
_main:  
        pushl   %ebp 
        movl    %esp, %ebp
        subl    $24, %esp
        leal    L_.str, %eax
        movl    %eax, (%esp)
        call    _puts
        movl    $0, -8(%ebp)
        movl    -8(%ebp), %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        addl    $24, %esp
        popl    %ebp
        ret

        .section        __TEXT,__cstring,cstring_literals
L_.str: 
        .asciz   "Hello world!\n"


.subsections_via_symbols

  • 有人能在这个问题上提供帮助吗
  • 如何使用IA-32 mac ox s assembly从上面提供的链接生成cpuid的工作版本
  • 在哪里可以找到Mac OS X中堆栈对齐问题的详细描述?我读过苹果网站上的内容,但对于初学者来说并没有多大帮助
  • 上述示例代码中的call\u put之后的指令是什么
  • 从程序集调用libc函数实际上是如何工作的?有关于这个主题的详细文章吗

谢谢大家!

首先,您需要了解调用约定中的寄存器用法,这是一个很好的地方

您会发现,在Mac OS X 64位上,返回“int”的函数(如main())的返回值在%rax中。您似乎希望使用32位可执行文件,在这种情况下,返回值为%eax。将寄存器归零的一种方便方法是将其与自身进行异或运算,因此应在例程末尾添加以下内容:

xorl  %eax,%eax

这会将%eax设置为零,这将是您的退出代码。

放置xorl%eax,%eax无效。使用gdb运行时会给出相同的消息。我收到了同样的消息:程序退出,代码为044。我知道了如何使程序返回程序正常退出。我知道了如何使程序返回程序正常退出。在调用_exit之前,如果我放入subl$12、%esp或addl$4、%esp,然后将_exit函数的参数pushl$0x0,则一切正常。但还是不明白为什么。上述两条指令的另一个等价方法是在调用_exit之前添加一个movl$0(%esp)。我了解全局,但我不了解背后的机制。我丢失了一些重要信息,我想不出是什么?!