为什么在调用函数时不保留值%r12

问题描述

据我了解,寄存器%r12〜%r15是通过调用函数保留的,但是如下面的源代码所示,当调用函数f时,似乎%r12的值已更改。问题在下面的asm代码的★★位置。 有人知道原因吗?

        .text
        .globl   f
        .type    f,@function
f:
        pushq    %rbp
        movq     %rsp,%rbp
        subq     $16,%rsp
        movq     %rdi,-8(%rbp)
        movq     -8(%rbp),%r12
        movq     $2,%r13
        cmpq     %r13,%r12
        setl     %r13b
        andq     $255,%r13
        cmpq     $0,%r13
        je       L1
        movq     $1,%r13     //★ increase input value + 1,and return
        movq     %r13,%rax
        jmp      L0
L1:
        movq     -8(%rbp),%r12
        movq     $1,%r14
        addq     %r12,%r14
        movq     %r14,%rax
        jmp      L0
        L0:
        addq     $16,%rsp
        popq     %rbp
        ret
.LS3:
        .string "return %d\n"
        .text
        .globl   main
        .type    main,@function
main:
        pushq    %rbp
        movq     %rsp,%rsp
        movq     $7,%r12    //★ store 7 to register r12
        movq     $10,%r15   
        movq     %r15,%rdi  //★ pass value 10 to function f
        call     f
        movq     %rax,%r15
        addq     %r12,%r15   //★★ expect value is 18 but it is 21,it seem value r12 is changed across call function f
        movq     %r15,-8(%rbp)
        movq     $.LS3,%rdi
        movq     -8(%rbp),%r15
        movq     %r15,%rsi
        call     printf
        movq     %rax,%r15
        movq     $0,%r12
        movq     %r12,%rax
        jmp      L2
        L2:
        addq     $16,%rsp
        popq     %rbp
        ret

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...