Sycall vs int 0x80

时间:2017-11-16 12:32:21

标签: linux assembly segmentation-fault 64-bit

Ubuntu 16.04, intel core i5

我正在使用汇编语言进行预算并编写了以下简单程序:

section .text
    global _start

_start:
    mov eax, 0x04 
    mov ebx, 0x01
    mov ecx, text
    mov edx, 0x03
    syscall

    mov eax, 0x01
    syscall

segment .data
    text db 'The text'

当我按如下方式编译时:

nasm -f elf64 main.asm
ld -o bin main.o

然后运行我得Segmentation fault。但是当我用syscall替换int 0x80并编译 64位 二进制文件时:

section .text
    global _start

_start:
    mov eax, 0x04 
    mov ebx, 0x01
    mov ecx, text
    mov edx, 0x03
    int 0x80

    mov eax, 0x01
    int 0x80

segment .data
    text db 'The text'

它工作正常并打印出我想要的内容。

如果我们只替换一个系统调用:

section .text
    global _start

_start:
    mov eax, 0x04 
    mov ebx, 0x01
    mov ecx, text
    mov edx, 0x03
    syscall

    mov eax, 0x01
    int 0x80

segment .data
    text db 'The text'

它不是Segfault,但它也不会打印任何内容。我做错了什么?为什么系统调用不像我期望的那样工作?

0 个答案:

没有答案