我目前正在尝试为我的学习学习汇编语言。我想我只是尝试试验和错误,但我不了解足够的装配对我来说能够做到这一点。我想写一个简单的程序,允许我输入2个数字,然后将这两个数字打印在一起,所以只需简单地加上即可。在linux x86-64和newline中添加两个数字
我试着开始只是想输入两个数字,比打印这两个,但我得到了分段错误,当我进入第二个数字。
我想知道的另一件事就是为什么我有当我放入“%d \ n”而不是“%d”时,连续两次输入一个数字。我想打印分开的行数,但是当我尝试这样做时,我必须连续两次输入数字。我想知道为什么会发生这种情况,以及我如何解决这个问题。
如果之前询问过,我很抱歉。我之前可能遇到过这个帖子,但我很难理解这些解决方案以及其他人的代码。
.text
string: .asciz "Your first program\n"
number1: .asciz "%u"
number2: .asciz "%d"
.global main
main:
movq $0, %rax
movq $string, %rdi
call printf
call adding
call end
adding:
movq %rsp, %rbp
subq $8, %rsp
leaq -8(%rbp), %rsi
movq $number1, %rdi
movq $0, %rax
call scanf
popq %rsi
movq $number1, %rdi
movq $0, %rax
call printf
movq $0, %rdi
subq $8, %rsp
leaq -8(%rbp), %rsi
movq $number2, %rdi
movq $0, %rax
call scanf
popq %rsi
movq $number2, %rdi
movq $0, %rax
call printf
movq -16(%rbp), %rax
movq %rbp, %rsp
popq %rbp
movq -16(%rbp), %rax
movq %rbp, %rsp
popq %rbp
ret
end:
movq $0, %rdi
call exit
你不打印你的号码之后冲洗'stdout'。将format-string改为'“%d \ n”/“%u \ n”',或者在'printf()'后面调用'fflush(stdout)'。崩溃是因为你在你的第一个'scanf()'之后的'popq%rsi',但是在你第二次调用scanf()之前,你不会在堆栈上再次创建空间。 – EOF 2014-10-05 16:52:53
那么究竟应该编辑/放入什么? – asiannoob 2014-10-05 18:08:39