我刚刚开始学习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
我来自荷兰所以请不要担心这些评论,我为我糟糕的英语道歉。
答案 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论坛!