2

我在 Cygwin(Windows7-64 位)中使用 gcc 来运行这个例子 http://asm.sourceforge.net/howto/build.html

.data                   # section declaration
msg:
    .ascii  "Hello, world!\n"   # our dear string
    len = .-msg         # length of our dear string
.text                   # section declaration
            # we must export the entry point to the ELF linker or
    .global _start  # loader. They conventionally recognize _start as their
            # entry point. Use ld -e foo to override the default.
_start:
# write our string to stdout
    movl    $len,%edx   # third argument: message length
    movl    $msg,%ecx   # second argument: pointer to message to write
    movl    $1,%ebx     # first argument: file handle (stdout)
    movl    $4,%eax     # system call number (sys_write)
    int $0x80       # call kernel
# and exit
    movl    $0,%ebx     # first argument: exit code
    movl    $1,%eax     # system call number (sys_exit)
    int $0x80       # call kernel

通过 Cygwin 中的命令行 $as -o hello.o hello.s && ld -s -o hello hello.o && ./hello 结果是 分段错误

你能帮助我吗?

4

1 回答 1

6

Cygwin 不会使 Windows 与 Linux 二进制兼容,因此使用 int $0x80 的 Linux 系统调用将失败,因为 Windows 对系统调用有完全不同的约定。不过,生成的二进制文件应该可以在实际(或兼容的)Linux 环境中正常工作。

于 2013-06-16T11:37:09.570 回答