我编写了一个简单的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
答案 0 :(得分:1)
这很奇怪,没有人使用.intel_syntax
而没有使用.intel_syntax noprefix
(因此您不需要注册名称上的%
和$
直接的)。
你肯定应该在你的问题中加入。 (更新:哦,你做了,但只是埋在段落的文本中,看起来它只是说明你的gdb输出中的内容)。我只是在注意到你的全源链接时才注意到,因为很奇怪你没有对商店说出任何关于绝对地址1
segfaulting(mov %ebx, 0x1
会出现的语法)模式)。
mov %ecx,string
从string
加载到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
。