簡體   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