[英]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.