방금 어셈블리 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
내가 그렇게 의견에 대한 걱정을하지 말아주십시오 네덜란드에서 오전 내 나쁜 영어 죄송합니다.
질문은 * 어디에 *는 세분화 오류입니까? 디버거를 사용하여 프로그램을 단계별로 실행하고 그 원인이되는 단계를 찾을 수 있습니다. 어떤 명령으로 인해 어떤 명령이 발생했는지 알게되면 그 명령이 왜 잘못된 것을하고 있는지 * 생각할 수 있습니다. 디버거를 잡아라. –
@TNH 당신은 영어가 그렇게 나쁘지 않습니다. 예를 들어, 저는 네덜란드어로 한 단어를 말할 수 없었습니다. 그러나 소스 나 소스 코드에서 영어가 아닌 다른 언어를 사용하는 것은 일반적으로 좋지 않습니다. 이것은 완벽한 예입니다. 이러한 주석이 영어로 작성 되었다면 우리 중 일부는 코드가 실제 의도와 다른 부분을 발견 할 수 있습니다. 적어도 SegFault가 올 수있는 명확한 단서를 제공합니다. – Powerslave