Printf Change values in registers, ARM Assembly

后端 未结 2 1879
情歌与酒
情歌与酒 2020-12-11 11:46

I\'m new to assembly programing and I\'m programing for ARM. I\'m making a program with two subroutines: one that appends a byte info on a byte vector in memory, and one tha

相关标签:
2条回答
  • 2020-12-11 12:04
    printvector:
        push {lr}
    
        ldr r3, =vet @ stores the address of the start of the vector in r3
        ldr r2, [r3], #1 @ stores the number of elements in r2
    
    .align  
    loop:
        cmp r2, #0 @if there isn't elements to print
        beq fimimprime @quit subroutine
        ldr r0, =node   @r0 receives the print format
        ldr r1, [r3], #1 @stores in r1 the value of the element pointed by r3. Increments r3 after that.
        sub r2, r2, #1 @decrements r2 (number of elements left to print)
        bl printf @call printf
        b loop @continue on the loop
    
    .align  
    endprint:
        pop {pc}
    

    that is definitely not how you use align. Align is there to...align the thing that follows on some boundary (specified in an optional argument, note this is an assembler directive, not an instruction) by padding the binary with zeros or whatever the padding is. So you dont want a .align in the code flow, between instructions. You have done that between the ldr r1, and the cmp r2 after loop. Now the align after b loop is not harmful as the branch is unconditional but at the same time not necessary as there is no reason to align there the assembler is generating an instruction flow so the bytes cant be unaligned. Where you would use .align is after some data declaration before instructions:

    .byte 1,2,3,4,5,
    .align
    some_code_branch_dest:
    

    In particular one where the assembler complains or the code crashes.

    0 讨论(0)
  • 2020-12-11 12:07

    The ARM ABI specifies that registers r0-r3 and r12 are to be considered volatile on function calls. Meaning that the callee does not have to restore their value. LR also changes if you use bl, because LR will then contain the return address for the called function.

    More information can be found on ARMs Information Center entry for the ABI or in the APCS (ARM Procedure Call Standard) document.

    0 讨论(0)
提交回复
热议问题