gpt4 book ai didi

linux - GNU 汇编程序 sys_write 不工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:08 27 4
gpt4 key购买 nike

我写了一个简单的 ASM 程序,但 sys_write 没有给出任何输出。我想我对指向 %ecx 的指针犯了一个错误,并且 sys_write 无法访问该字符串 - 但到目前为止我还没有发现我的错误。 sys_write存入%eax且小于0后的返回码。有很多“Hello World”示例,但我想了解我做错了什么,而不是了解还有其他工作代码的事实:-)
我使用带前缀的 Intel 语法。gdb 输出如下所示:

gdb ./testsasm GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1...Reading symbols from ./testsasm...done.(gdb) break mainBreakpoint 1 at 0x4004d6: file t.asm, line 13.(gdb) nThe program is not being run.(gdb) runStarting program: ...src/gnu_asm/testsasm Breakpoint 1, main () at t.asm:1313          mov  %ebx,0x1            # file handle stdout(gdb) n14          mov  %eax,0x4            # systemcall sys_write(gdb) n15          mov  %ecx,string         # pointer of the string const(gdb) n16          mov  %edx,slen           # string lenght(gdb) n17          int  0x80             # call write(gdb) print $ecx$1 = 1819043144(gdb) print $edx$2 = 7(gdb) print *$ecxCannot access memory at address 0x6c6c6548(gdb)

Makefile 和源代码可以在这里找到:http://paste.ubuntu.com/23115239

最佳答案

这很奇怪,没有人在没有 .intel_syntax noprefix 的情况下使用 .intel_syntax(因此您不需要在寄存器名称上使用 %,并且$ 在立即数上)。

您绝对应该将其包含在您的问题中。 (更新:哦,你做到了,但只是隐藏在一段看起来只是在说明你的 gdb 输出中的内容的段落的文本中)。我只是在查看您的完整源链接时才注意到,因为奇怪的是您没有说任何关于绝对地址 1 段错误的存储(mov %ebx, 0x1 将处于 at&t 语法模式)。


mov %ecx,stringstring 加载到 ecx。使用 .intel_syntax noprefix,您需要 mov ecx, OFFSET string 来获取地址作为立即数。使用 intel_syntax“prefix”模式,您可能可以 mov %ecx, $string 获得 mov r32, imm32


把这个放在你的 ~/.gdbinit 中:

set disassembly-flavor intel
layout reg

Return code after sys_write is stored in %eax and is less 0

如果你查一下,它应该是 -EFAULT 传递一个错误的地址。

关于linux - GNU 汇编程序 sys_write 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39247886/

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