我写了一个简单的ASM程序,但是sys_write没有给出任何输出。我猜我做了一个错误的指针到%ecx和sys_write不能访问字符串-但我没有发现我的错误到目前为止。sys_write之后的返回码存储在%eax中,且小于0。有很多"Hello World"的例子,但我喜欢了解我做错了什么,而不是有其他工作代码的事实:-)
我使用带有前缀的英特尔语法。GDB输出如下所示:
Makefile和源代码可以在这里找到:http://paste.ubuntu.com/23115239
这很奇怪,没有人使用.intel_syntax
没有.intel_syntax noprefix
(所以你不需要%
的寄存器名,和$
的立即)。
你应该在你的问题中提到这一点。(更新:哦,你做到了,但只是隐藏在一个段落的文本中,看起来像是在说明你的gdb输出中的内容)。我只注意到,当我看着你的全源链接,因为它是奇怪的,你没有说任何关于存储到绝对地址1
segfaulting (mov %ebx, 0x1
将在at&t语法模式)。
mov %ecx,string
从string
加载到ecx。对于.intel_syntax noprefix
,您需要mov ecx, OFFSET string
将地址作为直接常数来获取。使用intel_syntax"prefix"模式,您可能可以mov %ecx, $string
获得mov r32, imm32
把这个放进你的~/.gdbinit
:
set disassembly-flavor intel
layout reg
sys_write存储在%eax后的返回码小于0
如果你查找它,它应该是-EFAULT
传递一个错误的地址