GNU汇编器sys_write不工作



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

<>之前gdb。/testsasmGNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04...从。/testsasm读取符号…完成。(gdb)断开主断点1在0x4004d6:文件t.m asm,第13行。(gdb) n程序没有运行。(gdb)运行启动程序:src/gnu_asm/testsasm断点1,main()在t.asm:13# #文件句柄标准输出(gdb) n# mov %eax,0x4 # systemcall sys_write(gdb) n15 mov % ex,字符串#指针的字符串const(gdb) n16 mov %edx,slen #字符串长度(gdb) n17 int 0x80 # call write(gdb)打印$ecx$1 = 1819043144打印$edx2美元= 7美元(gdb)打印*$ecx无法访问地址0x6c6c6548的内存(gdb)之前

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

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

你应该在你的问题中提到这一点。(更新:哦,你做到了,但只是隐藏在一个段落的文本中,看起来像是在说明你的gdb输出中的内容)。我只注意到,当我看着你的全源链接,因为它是奇怪的,你没有说任何关于存储到绝对地址1 segfaulting (mov %ebx, 0x1将在at&t语法模式)。


mov %ecx,stringstring加载到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传递一个错误的地址

最新更新