繁体   English   中英

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

[英]When popping a number from the stack in aarch64 it doesn't work in cmp

几天前我写了一个关于没有 C 无法打印数字的问题。 从那时起,我就开始使用它来防止通过堆栈 FI-LO 反向打印的数字

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

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

B: 10 是 ascii 换行符,所以我也可以使用相同的 printloop 来打印它,最后检查它是否是 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, x12, x13
        udiv x12, x12, x16
        add x13, x13, #48

        str w13, [sp, #-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

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

output 是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM