GNU汇编程序sys_write不起作用

时间:2016-08-31 11:03:54

标签: linux assembly x86 gas

我编写了一个简单的ASM程序,但sys_write没有提供任何输出。我猜我用指针进入%ecx时出错了,sys_write无法访问字符串 - 但到目前为止我还没有找到我的错误。 sys_write存储在%eax后的返回码少于0。 有很多" Hello World" -Examples但我喜欢理解我做错了什么,而不是有其他工作代码的事实:-)
我使用带有前缀的英特尔语法。 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)

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

1 个答案:

答案 0 :(得分:1)

这很奇怪,没有人使用.intel_syntax而没有使用.intel_syntax noprefix(因此您不需要注册名称上的%$直接的)。

你肯定应该在你的问题中加入。 (更新:哦,你做了,但只是埋在段落的文本中,看起来它只是说明你的gdb输出中的内容)。我只是在注意到你的全源链接时才注意到,因为很奇怪你没有对商店说出任何关于绝对地址1 segfaulting(mov %ebx, 0x1会出现的语法)模式)。

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