问题描述
几天前,我写了一个关于没有 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