ARM legV8程序收到信号SIGSEGV,分段故障

时间:2017-10-27 13:16:01

标签: gcc assembly segmentation-fault arm armv8

我最近在汇编(ARM legV8)中编写了这段代码,它使用递归来计算64位随机数之间的gcd。首先,我使用random()生成2个随机数,然后我检查它是否是相对素数(gcd(num1,num2)== 1)。如果没有,则生成新数字。重复,直到找到相对素数。 random()和gcd()函数工作正常(选中)。当我尝试在其上存储更新的值时,我遇到堆栈问题(分段错误)。我第三次在该行上调用循环时出现错误 str x22,[x29,24] 这是我的代码:

        .data                                   //Start of the datasegment
q_initialState:         .string "Please enter the intial state : "
scanner_hex:            .string "%p"
output_num:             .string "%llu\n"
gcd_result:             .string "GCD is : %d\n"
message:                .string "They are prime numbers \n"
.text                                   //Start of the .text segment
    .global main
main:
    stp     x29,x30,[sp,-32]!               
    add     x29,sp,0 

    adr     x0,q_initialState             
    bl      printf   

    add     x1,x29,28
    adr     x0,scanner_hex                  
    bl      scanf 

    ldr     x19,[x29,28]                   //this is the initial state
loop: 

    mov     x2,x19                                                 
    bl      random 
    mov     x22,x5 
    mov     x1,x22
    adr     x0,output_num
    bl      printf  

    mov     x2,x19                          
    bl      random 
    mov     x23,x5
    mov     x1,x23
    adr     x0,output_num
    bl      printf

    str     x22,[x29,24]         // <----------- ERROR HERE ---------
    str     x23,[x29,28]    

    bl      gcd 
    cmp     x24,1
    bne     loop

    ldp     x29,x30,[sp],32
    ret

random:                                    
    stp     x29,x30,[sp,-32]!              
    add     x29,sp,0         

    eor     x2,x2,x2,lsr 12                  
    eor     x2,x2,x2,lsl 25                
    eor     x2,x2,x2,lsr 27  
    ldr     x4,=0x2545f4914f6cdd1d  
    mul     x5,x2,x4 

    mov     x19,x2

    ldp     x29,x30,[sp],32                 
    ret

gcd:
    stp     x29,x30,[sp,-32]!
    add     x29,sp,0

    ldr     x9,[x29,56]             //Value for variable m
    ldr     x10,[x29,60]            //Value for variable n

    udiv    x11,x9,x10                 
    mul     x11,x11,x10
    sub     x1,x9,x11   

    cbz     x1,return_n
    str     x10,[x29,24]
    str     x1,[x29,28]
    bl      gcd

    ldp     x29,x30,[sp],32
    ret

return_n:
    ldr     x1,[x29,60]
    mov     x24,x1
    ldp     x29,x30,[sp],32
    ret 

0 个答案:

没有答案
相关问题