我是汇编语言的新手,在我的第一步中遇到了问题。我有一些高级语言的经验,但我觉得这个低级别的初学者。
我在Xubuntu系统上使用GNU汇编程序(气体)版本2.23 x86_64。
我写了一个简单的hello世界,现在我想将它扩展到以下功能:
如果我运行代码,它适用于较短的输入,但如果我输入更多的5个字符,我会收到访问冲突。
这是我的代码:
#
# 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
答案 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
可以被认为是指......
This
与That
的关系是什么?更重要的是,This
高于,等于或低于That
?
我现在会坚持使用无符号整数;因为它最简单。
不确定GNU,但对于其他汇编程序,当您在大脑中使用无符号思维时,您希望使用说明JA
和JB
以及JE
进行比较。< / p>
JA
是&#34;如果超过&#34;
JB
是&#34;如果低于&#34;
JE
是&#34;如果相等则跳转#34;
您正在使用的JG
可以签名算术;我们以后会担心的。
为了使事情更加混乱,汇编语法可以颠倒操作数的顺序,你需要改变你的心理状态并思考这个问题而不是原来的问题......
That
与This
的关系是什么?好的,现在,设置断点,这就是你如何理解这一点......
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
!