2014-10-05 49 views
0

我目前正在尝试为我的学习学习汇编语言。我想我只是尝试试验和错误,但我不了解足够的装配对我来说能够做到这一点。我想写一个简单的程序,允许我输入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 
+0

你不打印你的号码之后冲洗'stdout'。将format-string改为'“%d \ n”/“%u \ n”',或者在'printf()'后面调用'fflush(stdout)'。崩溃是因为你在你的第一个'scanf()'之后的'popq%rsi',但是在你第二次调用scanf()之前,你不会在堆栈上再次创建空间。 – EOF 2014-10-05 16:52:53

+0

那么究竟应该编辑/放入什么? – asiannoob 2014-10-05 18:08:39

回答

0

这里有一些修正,以适用于你的程序:

.text 

    string: .asciz "Your first program\n" 
    number1in: .asciz "%u"  #use different format strings for input and output 
    number2in: .asciz "%d" 
    number1out: .asciz "%u\n" #added "\n" to flush stdout. 
    number2out: .asciz "%d\n" #same 

.global main 

main: 
    movq $0, %rax 
    movq $string, %rdi 
    push %rbp   #dummy push to satisfy 16-byte alignment requirements 
    call printf 
    call adding 
    call end 

adding: 
    pushq %rbp   #must preserve %rbp before... 
    movq %rsp, %rbp  #...%rbp is overwritten here 
    subq $16, %rsp  #must subtract 16 from %rsp to satisfy 16-byte alignment 
    leaq -8(%rbp), %rsi 
    movq $number1in, %rdi 
    movq $0, %rax 
    call scanf 
    movq -8(%rbp), %rsi #this line must be edited... 
    movq $number1out, %rdi 
    movq $0, %rax 
    call printf 
    movq $0, %rdi 
    leaq -8(%rbp), %rsi 
    movq $number2in, %rdi 
    movq $0, %rax 
    call scanf 
    movq -8(%rbp), %rsi #as must this... 
    movq $number2out, %rdi 
    movq $0, %rax 
    call printf 
    movq %rbp, %rsp 
    popq %rbp 
    ret 

end: 
    pushq %rbp   #dummy push to satisfy 16-byte alignment 
    movq $0, %rdi 
    call exit 
+0

您何时/何地将两个数字加在一起? – asiannoob 2014-10-06 11:59:31

+0

我的慷慨应该是有限的,特别是当你要求我做你的工作时。当你问我如何阻止你的程序进行分割时,没关系。要求我为你写,而不是那么多。 – EOF 2014-10-06 14:45:49

+0

对不起,我不是那个意思。我非常感谢你的帮助。 – asiannoob 2014-10-09 13:34:58