微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 aarch64 中从堆栈中弹出一个数字时,它在 cmp 中不起作用

如何解决在 aarch64 中从堆栈中弹出一个数字时,它在 cmp 中不起作用

几天前,我写了一个关于没有 C 就无法打印数字的问题。从那时起,我就可以通过堆栈 FI-LO 使数字不反向打印

我这样做的方式是一开始我将 10 压入堆栈。我这样做有两个原因:

A:10 是一个两位数,所以我知道我永远不会把它放在堆栈中并将它用作“最后一位数字”和

B: 10 是 ascii 换行符,所以我也可以使用相同的打印循环来打印它,最后检查它是否是 10

既然我已经解释过了,我想展示实际的代码

.globl _start

_start:
        b printNumberStart

printNumberStart:
        sub sp,sp,#(16*20)
        mov x12,#12345   /*the num to print*/
        mov x16,#10
        str x16,[sp,#-16]!

getStrs:
        udiv x14,x12,x16
        msub x13,x14,x16,x12
        sub x12,x13
        udiv x12,x16
        add x13,x13,#48

        str w13,#-16]!

        cmp x12,#0
        beq printStrs
        b getStrs

printStrs:
        mov x1,sp
        ldr x3,[sp],#16
        mov x2,#1
        mov w8,#64
        svc #0
        cmp x1,#10
        beq exit
        b printStrs

因为这是我第一次使用堆栈,所以我包含了整个代码,所以问题可能出在上面。

输出为:

12345
'R�
   C�6RL��d@8�����8�H$pamn=OhaitudrGE/sm=te-MmeS./.nar./jdvl./xfofrom/ce-toma:reeu/krrsmstc.mawtesscemodrm/-1sPnaara.narol.nalaka/korm/omsfas/v/eyf.mofpmsaw:rb/aeopfmatymjeO/damnaiempSegmentation fault

所以换行符与其他任何东西一起工作(我用 55 替换了 10,看看我是否会打印 7 并且确实如此),只是 cmp x1,#10 不起作用。

我也无法将数字弹出到寄存器中,所以我首先读取最高值,然后弹出它。可能不是一个方法,还请纠正我所做的其他愚蠢的事情,因为这都是自学的。

解决方法

@user3124812 帮我解决了这个问题。

当我将 StackPointer 加载到 x1 中时,它会存储地址,系统调用将使用该地址来访问地址空间。

这也是我没有让 pop 工作的原因,因为我需要的是地址而不是值。

因此解决方案是:

printStrs: 
   mov x1,sp
   ldr x10,[sp],#16 
   mov x2,#1 
   mov w8,#64 
   svc #0 
   cmp x10,#10 
   beq exit 
   b printStrs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。