基本的装配练习我无法解决

时间:2014-09-29 12:32:35

标签: assembly x86

我刚刚开始学习Assembly x86,我必须做一个我无法解决的练习。 我们的想法是创建一个程序,您要求用户使用Scanf键入数字。然后程序将数字加1并输出该数字(所以基本上输出=输入+1)。

当我使用我的代码时,控制台会向我显示分段错误。

代码:

mystring:   .asciz "name_of_the_programmer\nLast_Name\nAssignment 2:inout\nGive a number:\n"    #Creëert een stuk tekst
nrstring:   .asciz "%d"

.global main


main:

    movq        $0, %rax                                #Geeft de locatie %rdi een waarde van 0, maakt %rdi leeg
    movq        $mystring, %rdi                             #Voegt de waarde van mystring (het stuk tekst) toe aan %rdi
    call        printf                                  #Print de waarde van  %rdi
    call        inout                                   #roept inout op

inout:  

        pushq %rbp
        movq %rsp , %rbp

        subq $8, %rsp                                   #Plaatst stackPointer goed 
        leaq -8(%rbp), %rsi                             #Laad het adres in rsi

        movq $0, %rdi                                   #Maakt rdi leeg     
        movq $nrstring, %rdi                                #Verplaatst string nrstring naar rdi    (1e arg. scanf)
        movq $0, %rax                                   #Maakt RAX leeg   (2e arg. scanf)
        call scanf                                  #Roept Scanf op

        incq %rdi
        movq %rdi, %rax
        call printf

        movq %rbp, %rsp
        popq %rbp
        ret

end:
    mov         $0, %rdi                                #Maakt %rdi leeg
    call        exit                                    #Sluit het programma af

我来自荷兰所以请不要担心这些评论,我为我糟糕的英语道歉。

1 个答案:

答案 0 :(得分:0)

在不了解环境的情况下,您运行此代码我得出的结论是,您将%RSI设置为堆栈中的一个地址,而您忘记将DS初始化为SS中的值!

为什么首先清空%RDI?

movq $0, %rdi         #Maakt rdi leeg     
movq $nrstring, %rdi  #Verplaatst string nrstring naar rdi

Je hoeft je niet te verontschuldigen dat je van Holland komt! Schrijf wel steeds Engelstalige commentaren。程序员lukt zoveel beter je de hele tijd in dezelfde taal blijft denken / werken。 Welkom op dit论坛!