【ARM汇编的堆栈问题】压栈运用|堆栈类型测试
【摘要】 【ARM汇编的堆栈问题】压栈运用|堆栈类型测试
如何用ARM汇编语言输出3个以上数据 | ARM汇编的堆栈有什么作用 | 如何运用 | 堆栈类型又如何检验呢?
【ARM汇编的堆栈问题】
今天来带大家了解ARM汇编的堆栈问题
-
ARM汇编中压栈能解决什么问题?
-
ARM微处理器有哪几种类型的堆栈工作方式呢?
-
堆栈类型又如何检验呢?
写在前面:为什么必须要讲ARM的堆栈问题,因为如果没有堆栈的运用很多问题是没有办法解决的,之前有文章讲到,只能用寄存器R0~R3来传递参数,因此当你需要传递多个参数的时候就会收到限制,该怎么解决?这里就引入了压栈和出栈概念的运用。
看完前面写的文章,大家肯定学会了如何从内存获取地址、如何读取数据、如何调用scanf和printf,但只能输入和输出三个数据,今就带大家学习一下如何运用栈输入输出4个数据甚至更多。
怎么一次性输出多个数据呢?
其实很简单,只需要我们在ARM汇编中栈的运用。用于传递参数的寄存器只有四个R0~R3,也称为易失性寄存器,当一次需要传递的参数较多时,我们可以先把数据压到栈中,这样我们把R0~R3的数据读取完毕后,就会优先读取栈顶中的数据依次类推,如果不压入栈中,自然就没有办法读取到。 |
:dizzy:没有接触栈概念时的思路(从内存中读取地址——将内容传给寄存器——调用printf显示)
源代码:
.data
str:.asciz " %5d\n %5d\n %5d\n %5d\n"
a:.word 1
b:.word 2
c:.word 3
d:.word 4
.text
.globl main
main:
stmfd sp!,{lr}
ldr r0,=a
ldr r1,[r0]
ldr r0,=b
ldr r2,[r0]
ldr r0,=c
ldr r3,[r0]
ldr r0,=d
ldr r4,[r0]
ldr r0,=str
bl printf
mov r0, #0
ldmfd sp!,{lr}
mov pc,lr
.end
运行结果:
如果这一部分代码还是看不明白的话,那就请小可爱自行看前面写的文章了哦。【ARM嵌入式基础】
我们发现第四个数据并不是我们想要的数据,这里为什么会出错呢?就是因为我们调用printf也好scanf也好只能用R0~R3中的数据,R4中的数据取不到的。
如何压入栈中,输出正确结果呢?
:star:我们知道了为什么出错,下面就来看看怎么不出错
从上面例子中来看,想输出内存中“d”的值,就要把获取到“d”数据的寄存器压到栈中,让调用printf的时候能找到它。我们看,r4其实已经通过取地址和间接寻址获取到了“d”的数据,那么只需要把r4压到栈中就可以。 压栈的指令在这篇文章中其实已经提到【ARM汇编模板】 :sparkling_heart:这里由于我们调用了printf,调用之后实际上已经把r4出栈,所以不用加pop {r4} 但是当没有运用函数让他出栈时要手动出栈,因为我们一定要遵循堆栈平衡原则,我们来看下一 压栈后的源代码: 运行结果::thumbsup:没错,就是这么简单!大家一定要动手试一下哦 ARM微处理器有哪几种堆栈工作方式呢?既然提到了栈的运用,就把它给讲明白
|
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)