Printf 更改寄存器中的值,ARM 程序集 [英] Printf Change values in registers, ARM Assembly

查看:24
本文介绍了Printf 更改寄存器中的值,ARM 程序集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是汇编编程的新手,我正在为 ARM 编程.我正在制作一个带有两个子例程的程序:一个在内存中的字节向量上附加字节信息,另一个打印这个向量.向量的第一个地址包含后面的元素数,最多 255 个.当我用 GDB 调试它时,我可以看到appendbyte"子例程工作正常.但是当谈到printvector"时,就存在一些问题.首先,寄存器 r1 中加载的元素是错误的(它加载 0,而它应该是 7).然后,当我在使用printf"函数后用 GDB 读取寄存器值时,很多寄存器得到了不应该改变的其他值,因为我没有修改它们,我只是使用了printf".为什么printf"要修改值.

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 that prints this vector. The first address of the vector contains the number of elements that follows, up to 255. As I debug it with GDB, I can see that the "appendbyte" subroutine works fine. But when it comes to the "printvector" one, there are some problems. First, the element loaded in register r1 is wrong (it loads 0, when it should be 7). Then, when I read the registers values with GDB after I use the "printf" function, a lot of register get other values that weren't supposed to change, since I didn't modify them, I just used "printf". Why is "printf" modyfing the values.

我在想一些关于对齐的事情.我不确定我是否正确使用了指令.

I was thinking something about the align. I'm not sure if i'm using the directive correctly.

完整代码如下:

    .text
    .global main    
    .equ    num, 255    @ Max number of elements

main:
    push    {lr}

    mov r8, #7
    bl appendbyte
    mov r8, #5
    bl appendbyte
    mov r8, #8
    bl appendbyte
    bl imprime

    pop {pc}

.text
.align  

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}

.align  
appendbyte:
    push {lr}

    ldr r0, =vet    @stores in r0 the beggining address of the vector
    ldr r1, [r0], #1    @stores in r1 the number of elements and makes r0 point to the next address
    add r3, r0, r1  @stores in r3 the address of the first available position
    str r8, [r3]    @put the value at the first available position
    ldr r0, =vet    @stores in r0 the beggining address of the vector
    add r1, r1, #1  @ increment the number of elements in the vector
    str r1, [r0]    @ stores it in the vector

    pop {pc}

.data           @ Read/write data follows
.align          @ Make sure data is aligned on 32-bit boundaries
vet:    .byte 0
    .skip   num     @ Reserve num bytes

.align
node:   .asciz "[%d]\n"

.end

问题出在

    ldr r1, [r3], #1

    bl printf

我希望我清楚这个问题.提前致谢!

I hope I was clear on the problem. Thanks in advance!

推荐答案

ARM ABI 指定寄存器 r0-r3 和 r12 在函数调用时被视为易失性.这意味着被调用者不必恢复其值.如果使用 bl,LR 也会发生变化,因为 LR 将包含被调用函数的返回地址.

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.

可以在 ABI 或在 APCS(ARM 过程调用标准)文档.

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

这篇关于Printf 更改寄存器中的值,ARM 程序集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆