Работа в ARM Assembly связана с firefly и работает с ошибкой сегментации - PullRequest
0 голосов
/ 03 декабря 2018

Работал над программой сборки ARM, которая вводит номер пользователя, а затем выводит двоичный эквивалент.Я логически думал, что это нормально, и я не уверен, что мне не хватаетКогда я запускаю его от светлячка, я получаю Сегментацию.Кто-нибудь есть идеи, где мой код идет не так?Я провел большое количество интернет-поисков, чтобы понять, что такое ошибка сегментации, и, насколько мне известно, и, просматривая мои регистры, они, кажется, все сделали правильно.

Спасибо.

//this will lead to reading the user's input string in decimal  '''
.data
readformat:     .asciz "%d"

//defining some text for displaying later
//when using printf X1 register would take place instead of %d
.text
enter:           .string "Input: \n"
output:     .asciz "Output: \n"
out:     .asciz "%d"
outend:     .asciz "\n"

//initializing the main function
.balign 4
.global main

main:           
stp     x29,    x30,    [sp,    -16]!
mov     x29,    sp

//Asking the user to leave a number
//by displaying entery text ("Input: \n")
ldr x0, =enter
bl printf


//adjusting the stack for 2 items
sub sp, sp, #16

//getting the value
//scanf places its result on the stack
ldr x0, =readformat
mov x1, sp
bl scanf

//save the value from the stack
ldr x9, [sp]

//restore the stack
add sp, sp, #16

//put the read value into an argument for the BIN function
mov x0, x9

//Jump to BIN function line number and returning after the execution
//BIN function will print out the result
bl bin

//printing a new line symbol
ldr x0, =outend
bl      printf

//the end
b done

bin:    
//saving n (the argument) and the return address to the stack
SUB SP, SP, #16 // adjust stack for 2 items
MOV X9, X30
STUR X9, [SP,#8] // save the return address
STUR X0, [SP,#0] // save the argument

SUBS X9,X0, #1       // test for n < 1
B.GE  L1               // if n >= 1 , go to L1

ADD  SP,SP,#16        // pop 2 items off stack
BR   X30               // return to caller

//recursive case
L1:   

LSR X0,X0,#1      // n >= 1: shift X1 to the right once
BL bin            // call fact with (n >>1)

//restore stack after return from base case
LDUR X0, [SP,#0]       // return from BL: restore argument n
LDUR X9, [SP,#8]       // restore the return address
MOV X30, X9
ADD SP, SP, #16       // adjust stack pointer to pop 2 items

//masking x1 in order to find what's the least significant bit '''
AND X0,X0,#0x1

//printing out the least significant bit, the argument is already in x0
bl   printf


BR X30  //now this recursive call is done





done:           mov x0, 0

end:            ldp     x29,   x30,   [sp],   16
ret
...