Работал над программой сборки 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