为什么我没有得到分段错误?

问题描述 投票:1回答:1

我是汇编编程和使用简单示例和gdb进行实验的新手。这是我写的程序:

1.asm

section .text
    global _start
    extern _print_func

_start:
    push str
    movzx rdx, byte [str_len]
    push dx ;  <---  typo here, should be rdx
    call _print_func

    mov rax, 60
    syscall

section .data
    str: db 'Some data',0x0A,0x0D
    str_len: db $ - str

2.asm

section .text
    global _print_func

_print_func:
    pop rbx
    pop rdx
    pop rsi
    mov rax, 0x01
    mov rdi, 0x01
    syscall
    push rbx
    ret

section .data
    str: db 'Some string',0x0A,0x0D
    str_len: db $ - str

编译后,链接(与ld)并运行程序它只是打印没有。所以我在syscall之前检查了寄存器的内容。

(gdb) info registers 
rax            0x1      1
rbx            0x4000c5 4194501
rcx            0x0      0
rdx            0x6000e4000b     412331802635  ; <-- obviously wrong
rsi            0x10000  65536
rdi            0x1      1
rbp            0x0      0x0
rsp            0x7fffffffdcc6   0x7fffffffdcc6

所以系统调用应该尝试从412331802635开始读取0x10000字节,我认为这应该导致Segmentation Fault,因为程序不允许访问所有字节。

但它默默无声地打印出来。为什么?为什么没有提出Segmantation Fault?这是某种未定义的行为吗?我在Ubuntu 16.04 LTS下使用intel core i5

linux assembly segmentation-fault x86-64
1个回答
4
投票

sys_write不会引发段错,它只返回一个-EFAULT错误代码。你应该在rax结束后在syscall看到。另见man 2 write

© www.soinside.com 2019 - 2024. All rights reserved.