Linux GNU汇编程序系统写入不工作

Linux GNU汇编程序系统写入不工作,linux,assembly,x86,gnu-assembler,Linux,Assembly,X86,Gnu Assembler,我写了一个简单的ASM程序,但sys_write没有给出任何输出。我猜我在将指针指向%ecx时犯了一个错误,sys_write无法访问该字符串-但到目前为止,我没有发现我的错误。sys_write之后的返回代码存储在%eax中,小于0。 有很多“Hello World”示例,但我喜欢理解我做错了什么,而不是有其他工作代码的事实:-) 我使用带前缀的英特尔语法。 gdb输出如下所示: gdb ./testsasm GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.

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

gdb ./testsasm GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 ... Reading symbols from ./testsasm...done. (gdb) break main Breakpoint 1 at 0x4004d6: file t.asm, line 13. (gdb) n The program is not being run. (gdb) run Starting program: ...src/gnu_asm/testsasm Breakpoint 1, main () at t.asm:13 13 mov %ebx,0x1 # file handle stdout (gdb) n 14 mov %eax,0x4 # systemcall sys_write (gdb) n 15 mov %ecx,string # pointer of the string const (gdb) n 16 mov %edx,slen # string lenght (gdb) n 17 int 0x80 # call write (gdb) print $ecx $1 = 1819043144 (gdb) print $edx $2 = 7 (gdb) print *$ecx Cannot access memory at address 0x6c6c6548 (gdb) gdb./testsasm GNU gdb(Ubuntu 7.11.1-0ubuntu1~16.04)7.11.1 ... 从./testsasm…读取符号完成。 (gdb)主断路器 断点1位于0x4004d6:文件t.asm,第13行。 (gdb)n 程序没有运行。 (gdb)运行 启动程序:…src/gnu\u asm/testsasm 断点1,t.asm处的main():13 13 mov%ebx,0x1#文件句柄标准输出 (gdb)n 14 mov%eax,0x4系统调用系统写入 (gdb)n 15 mov%ecx,字符串#字符串常量的指针 (gdb)n 16 mov%edx,弦长 (gdb)n 17 int 0x80#调用写入 (gdb)打印$ecx $1 = 1819043144 (gdb)打印$edx $2 = 7 (gdb)打印*$ecx 无法访问地址0x6C6548处的内存 (gdb)
可以在此处找到生成文件和源代码:

这很奇怪,没有人使用
。没有
的英特尔语法
(因此您不需要在寄存器名上使用
%
,在即时上使用
$

你肯定应该在你的问题中包括这一点。(更新:哦,你做了,但只是隐藏在一段文字中,看起来它只是在陈述你的gdb输出中的内容)。我只是在查看您的完整源代码链接时才注意到,因为奇怪的是,您没有提到存储到绝对地址
1
segfaulting(在at&t语法模式下,
mov%ebx,0x1


mov%ecx,string
string
加载到ecx
。使用
.intel\u syntax noprefix
,您需要
mov ecx,OFFSET string
以立即数形式获取地址。使用英特尔语法“前缀”模式,您可能可以
mov%ecx,$string
获得
mov r32,imm32


把这个放到你的
~/.gdbinit

set disassembly-flavor intel
layout reg

sys_write之后的返回代码存储在%eax中,小于0

如果您查找它,它应该是
-EFAULT
,用于传递错误地址。

非常感谢!“偏移字符串”正是帮助。