【发布时间】:2020-11-06 15:53:35
【问题描述】:
我正在尝试使用printf 在64bit Ubuntu 20 环境中将字符串str_1 的第一个字符打印到x86-assembly 中的标准输出,这是我的尝试:
; nasm -f test.asm && gcc -m32 -o test test.asm.o
section .text
global main
extern printf
some_proc:
mov esi, str_1
mov eax, [esi]
push eax
push argv_str
call printf
pop eax
ret
main:
call some_proc
ret
section .data
str_1 db `three`
argv_str db `%c\n`
这个输出:
t
Segmentation fault (core dumped)
预期标准输出:
t
为什么这段代码会导致分段错误,如何修改代码以输出预期的标准输出?
【问题讨论】:
-
您是否尝试过使用调试器查看故障实际发生的位置?
-
通过让你的入口点是
_start,你绕过了所有标准库的初始化代码,所以你不能指望任何标准库函数如printf能正常工作。这仅适用于根本不需要 C 库的程序,并且将通过原始系统调用完成所有工作。如果您需要 C 库,那么您需要将程序的入口点设为main。 -
您还有一个错误,即
mov eax, [esi]在您只需要 1 个字节时会加载 4 个字节。 -
哦,但实际上可能导致您崩溃的错误是您将参数推送到 printf 的堆栈中,并且您有责任将它们弹出,但您没有。
-
我如何只加载一个字节?将代码的入口点更改为
main并使用gcc编译后,我仍然收到分段错误。
标签: assembly x86 segmentation-fault