gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:24 25 4
gpt4 key购买 nike

我不熟悉汇编编程和使用简单示例和 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.汇编

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

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

但是它什么也没打印。为什么?为什么没有出现 Segmantation Fault?那是某种未定义的行为吗?我在 intel core i5 下使用 Ubuntu 16.04 LTS

最佳答案

sys_write 不会引发段错误,它只会返回 -EFAULT 错误代码。在 syscall 完成后,您应该在 rax 中看到它。另见 man 2 write

关于linux - 为什么我没有得到段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com