在Mac 0SX上使用x86汇编程序的Hello World

D.C*_*.C. 15 macos x86 assembly linker

我试图在我的Mac上深入研究一些x86汇编程序,但是在生成可执行文件时遇到了麻烦.这个问题似乎处于联系阶段.

helloWorld.s:

.data

    HelloWorldString:
    .ascii "Hello World\n"

.text

.globl _start

_start:
    # load all the arguments for write()
    movl $4, %eax
    movl $1, %ebx
    movl $HelloWorldString, %ecx
    movl $12, %edx
    # raises software interrupt to call write()
    int $0x80

    # call exit()
    movl $1, %eax
    movl $0, %ebx
    int $0x80
Run Code Online (Sandbox Code Playgroud)

组装程序:

as -o helloWorld.o helloWorld.s
Run Code Online (Sandbox Code Playgroud)

链接目标文件:

ld -o helloWorld helloWorld.o
Run Code Online (Sandbox Code Playgroud)

我在这一点上得到的错误是:

ld: could not find entry point "start" (perhaps missing crt1.o) for inferred architecture x86_64
Run Code Online (Sandbox Code Playgroud)

关于我做错了/遗失的任何建议都会非常有帮助.谢谢

Pau*_*l R 20

您可能会发现使用gcc构建更容易,而不是尝试对汇编器和链接器进行微管理,例如

$ gcc helloWorld.s -o helloWorld
Run Code Online (Sandbox Code Playgroud)

(您可能会想换_start_main,如果你走这条路线.)

顺便说一句,从一个有效的C程序开始,并从中研究生成的asm可能是有益的.例如

#include <stdio.h>

int main(void)
{
    puts("Hello world!\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.Sgenerate 编译时:

    .cstring
LC0:
    .ascii "Hello world!\12\0"
    .text
    .align 4,0x90
.globl _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $LC0, (%esp)
    call    _puts
    xorl    %eax, %eax
    leave
    ret
    .subsections_via_symbols
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑将此作为您自己的"Hello world"或其他实验性asm程序的模板,特别是考虑到它已经构建并运行:

$ gcc -m32 hello.S -o hello
$ ./hello 
Hello world!
Run Code Online (Sandbox Code Playgroud)

最后一条评论:谨防从面向Linux的asm书籍或教程中获取示例并尝试在OS X下应用它们 - 存在重要的差异!

  • @michaelsnowden代码是用-fno-PIC生成的,所以如果你想编译它,你需要使用`gcc -m32 -Wl,-no_pie hello.S -o hello`.或者,生成不带`-fno-PIC`的代码.这将给你稍微复杂的样板,但是你可以编译它而不必处理PIE问题. (2认同)