【问题标题】:GNU Assembler sys_write is not workingGNU 汇编器 sys_write 不工作
【发布时间】:2017-01-07 22:37:06
【问题描述】:

我写了一个简单的 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 ... 从 ./testsasm...读取符号完成。 (gdb) 中断主要 0x4004d6 处的断点 1:文件 t.asm,第 13 行。 (gdb) n 程序没有运行。 (gdb) 运行 启动程序:...src/gnu_asm/testsasm t.asm:13 处的断点 1,main () 13 mov %ebx,0x1 # 文件句柄标准输出 (gdb) n 14 mov %eax,0x4 # 系统调用 sys_write (gdb) n 15 mov %ecx,string # 字符串指针 const (gdb) n 16 mov %edx,slen # 字符串长度 (gdb) n 17 int 0x80 # 调用写入 (gdb) 打印 $ecx $1 = 1819043144 (gdb) 打印 $edx $2 = 7 (gdb) 打印 *$ecx 无法访问地址 0x6c6c6548 处的内存 (gdb)

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

【问题讨论】:

    标签: linux assembly x86 gnu-assembler


    【解决方案1】:

    这很奇怪,没有.intel_syntax noprefix 没有人使用.intel_syntax(所以你不需要%s 在寄存器名称上,$ 在立即数上)。

    您绝对应该在您的问题中包含这一点。 (更新:哦,你做到了,但只是埋在一个段落的文本中,看起来只是在说明你的 gdb 输出中的内容)。我只是在查看您的完整源代码链接时才注意到,因为奇怪的是您没有说明绝对地址 1 segfaulting 的商店(mov %ebx, 0x1 将在 at&t 语法模式下)。


    mov %ecx,stringstring 加载到 ecx。使用.intel_syntax noprefix,您需要mov ecx, OFFSET string 才能将地址​​作为直接常量。使用 intel_syntax “前缀”模式,您可能可以通过mov %ecx, $string 获得mov r32, imm32


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

    set disassembly-flavor intel
    layout reg
    

    sys_write 存储在 %eax 后的返回码小于 0

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

    【讨论】:

    • 非常感谢! “偏移字符串”是确切的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2014-06-19
    • 2018-05-20
    • 2020-09-20
    • 2015-12-20
    • 2010-10-18
    相关资源
    最近更新 更多