访问冲突气体读取系统调用

时间:2014-03-10 19:46:23

标签: assembly gas binutils

我是汇编语言的新手,在我的第一步中遇到了问题。我有一些高级语言的经验,但我觉得这个低级别的初学者。

我在Xubuntu系统上使用GNU汇编程序(气体)版本2.23 x86_64。

我写了一个简单的hello世界,现在我想将它扩展到以下功能:

  • 使用系统调用3
  • 读取输入
  • 检查输入是否大于指定的
  • 如果输入更短或相同
  • else打印错误消息

如果我运行代码,它适用于较短的输入,但如果我输入更多的5个字符,我会收到访问冲突。

我与this (German) tutorial合作。

这是我的代码:

#
# author: linluk
# filename: name.s
#
# usage:
#   $ as name.s -o name.o
#   $ ld name.o -o name
#   $ ./name
# 

.section .data
  hello: .ascii "hello, what is your name?\n"
  err: .ascii "too long!\n"
  name: .ascii ""

.section .text

.globl _start

_start:
  #output
  mov $4, %eax      # 4 syscall write
  mov $1, %ebx      # 1 filedescriptor stdout
  mov $hello, %ecx  # output buffer
  mov $26, %edx     # length of buffer
  int $0x80         # call

  #input
  mov $3, %eax      # 3 syscall read
  mov $0, %ebx      # 0 filedescriptor stdin
  mov $(name), %ecx # address of name
  mov $6, %edx      # max length
  int $0x80

  #check input length
  mov $5, %ebx             #######################
  cmp %ebx, %eax           # <-- HERE or         #
  jg problem #to long      # <-- HERE            #
                           # IS SOMETHING WRONG  #
                           # I GUESS !!          #
  #output of $name         #######################
  mov $1, %ebx
  mov $name, %ecx
  mov %eax, %edx
  mov $4, %eax
  int $0x80

  jmp exit

problem:
  #output of $err
  mov $4, %eax
  mov $1, %ebx
  mov $err, %ecx
  mov 10, %edx
  int $0x80

exit:
  mov $1, %eax      # 1 syscall exit
  mov $0, %ebx      # returnvalue
  int $0x80

2 个答案:

答案 0 :(得分:1)

我非常喜欢你提前完成作业的方式,并向我们展示了一些书面代码。

我非常喜欢你评论你的代码的事实;优秀的先生。现在我很乐意提供帮助(如果确实有帮助的话)。

好的,我会专注于这些东西......

mov $5, %ebx             #######################
cmp %ebx, %eax           # <-- HERE or         #
jg problem #to long      # <-- HERE            #
                         # IS SOMETHING WRONG  #
                         # I GUESS !!          #
#output of $name         #######################

不要担心;没有什么是错的。每个人都经历过这个(包括我)。

哇,我们从哪里开始。

好的,我明白了,15分钟的练习将为你解决这个问题。

首先,问题:您是否熟悉已签名而非寄存器和位级别的无符号数学?如果没有,准备一些脑细胞活动。

其次,为了进一步混淆,汇编程序的命名和语法会影响你可以期待什么样的结果(以及你最终会得到什么)。

我真的不懂GNU汇编程序,所以让我解释一下我是如何掌握它的。

指令Cmp This,That可以被认为是指......

  • ThisThat的关系是什么?

更重要的是,This高于,等于或低于That

我现在会坚持使用无符号整数;因为它最简单。

不确定GNU,但对于其他汇编程序,当您在大脑中使用无符号思维时,您希望使用说明JAJB以及JE进行比较。< / p>

JA是&#34;如果超过&#34;   JB是&#34;如果低于&#34;   JE是&#34;如果相等则跳转#34;

您正在使用JG可以签名算术;我们以后会担心的。

为了使事情更加混乱,汇编语法可以颠倒操作数的顺序,你需要改变你的心理状态并思考这个问题而不是原来的问题......

  • ThatThis的关系是什么?

好的,现在,设置断点,这就是你如何理解这一点......

 Mov $5, %ebx               # Your original way
 Cmp %ebx, %eax             # Same compare
 Ja problem                 # Unsigned maybe jump


 Mov $5, %ebx               # Same steps
 Cmp %ebx, %eax             # Same steps
 Jb problem                 # Opposite jump sense


 Mov $5, %ebx               # Now, similar steps
 Cmp %eax, %ebx,            # Comparing them in an opposite manner
 Ja problem                 # Watch to see if this jump hits


 Mov $5, %ebx               # Arrange them again
 Cmp %eax, %ebx,            # Backwards compare, but,,,,
 Jb problem                 # Opposite opinion of the flags

这四个例子假设两个数字(在Ebx和Eax中)是不同的。如果它们结果相同,那么我们将在另一天就这个问题进行广泛的讨论。

这又是关于无符号整数运算的全部内容。对某些人来说,这将是基本的东西;对于其他人而言,不要担心,在困惑中挣扎是老实说的常态。我知道我做到了。

无论如何,设置断点并运行这三个线段中的每一个,并在脑海中得到想法,&#34; ... 这个的关系是什么?那?...&#34;

当您逐步浏览每个3行代码段时,您就会明白这一点。

如果你搞砸了,那么第二次(或第三次或第四次或第五次)就会有意义。

不确定这是否有帮助,只是想我会为那些不熟悉regs和bit and flags和东西的人打字。

答案 1 :(得分:0)

Jester回答:

  

您忘记为名称预留空间。尝试: name:.space 6. 该错误是由 mov 10,%edx 行上缺少 $ 符号引起的。学习使用调试器。

谢谢他!现在它有效。

我将行name: .ascii ""更改为name: .space 6
并向$添加了mov 10, %ebx,使其看起来像mov $10, %ebx