【发布时间】:2018-04-27 12:12:37
【问题描述】:
这里是:
.SECTION .data
msg: .string "AAAA"
.SECTION .text
.globl _start
_start:
mov $1, %rax
mov $1, %rdi
mov msg, %rsi
mov $4, %rdx
syscall
这段代码不仅没有段错误,它也没有输出任何东西。
根据我的阅读,程序应该调用 sys_exit,否则会出现段错误,但这不会发生。
【问题讨论】:
-
试试
mov $msg, %rsi。指令mov msg, %rsi将msg的前八个字节移动到%rsi,这不是您想要的。 -
syscall之后会发生什么?使用像gdb这样的调试器单步即可找出答案。或使用strace ./my_prog。顺便说一句,在使用gcc -static -nostdlib foo.s构建后,它对我来说是段错误,正如预期的那样 -
这是在带有 gcc7.3.0 的 Arch Linux 上,
ld来自 binutils 2.29.1,这在静态可执行文件中会出现段错误。您是如何构建可执行文件的? -
使用英特尔语法。你那里没有这个问题。
-
@sivizius:
mov rsi, msg仍然是 GAS 的.intel_syntax noprefix模式下的负载,因为它是 MASM 风格,而不是 NASM 风格。你需要mov esi, OFFSET msg,或lea rsi, [rip + msg]
标签: linux assembly x86-64 system-calls gnu-assembler