AT&T Assembly Printing 以控制段错误

AT&T Assembly Printing to console Segfault

我正在关注在线教程,其中提供了用 NASM 语法编写的代码。 提供的代码是:

global _start

_start:
    sub esp, 4
    mov [esp], byte 'H'
    mov [esp+1], byte 'e'
    mov [esp+2], byte 'y'
    mov [esp+3], byte '!'
    mov eax, 4    ; sys_write system call
    mov ebx, 1    ; stdout file descriptor
    mov ecx, esp  ; pointer to bytes to write
    mov edx, 4    ; number of bytes to write
    int 0x80      ; perform system call
    mov eax, 1    ; sys_exit system call
    mov ebx, 0    ; exit status is 0
    int 0x80

我试图将其翻译成 AT&T 语法。我写了以下内容:

.global _start

_start:
    sub , %esp
    movb $'H', (%esp)
    movb $'e', 1(%esp)
    movb $'y', 2(%esp)
    movb $'!', 3(%esp)
    mov , %eax
    mov , %ebx
    mov %esp, %ecx
    mov , %edx
    int [=11=]x80
    mov , %eax
    mov [=11=], %ebx
    int [=11=]x80

然而,当我编译并执行这段代码时,我得到:

./build.sh: line 35: 1159 Segmentation fault    (core dumped) ./$FILE
139

我从 NASM 到 AT&T 的翻译是否正确? 如果是这样,就能够从为堆栈分配的内存中 read/write 而言,我是否缺少某些东西? (权限等)


构建信息:

在 Arch Linux 上构建 64 位系统

build.sh 脚本:

function usage { 
    echo $'\nUsage: ./build.sh -f [filename]\n'
    echo $' -f  The filename of the source file to be compiled without the file extension.\n'
}

if [ $# -lt 1 ]; then
    echo "No input files specified!"
    usage
    exit 1
fi

while [ $# -gt 0 ]; do
    case "" in
        -f)
            shift
            FILE=
            shift
            ;;
        *)
            echo "Please use -f to specify the input file!"
            usage
            exit 1
            ;;
    esac
done

if [ ! -f $FILE.s ]; then
    echo "$FILE.s doesn't exist!"
    usage
    exit 1
fi

gcc -c $FILE.s -o $FILE.o
ld $FILE.o -o $FILE
./$FILE
echo $?

您将其编译为 64 位代码,尽管 int 0x80 是 32 位中断。 我用来编译的:

as --32 inAssembly.s &&ld -o executable -m elf_i386 a.out.

as --32 inAssembly.s 使 gnu 汇编程序采用 32 位体系结构,发出 32 位目标文件。

ld -o executable -m elf_i386 a.out 调用链接器,将目标设置为 elf_i386 并将链接文件放入 executable.