树莓派Arm汇编:如何写入RAM并打印验证数据?
关于汇编中用户输入存储与保留的问题解答
1. 你的代码已经实现了「写入RAM+打印验证」
你当前的代码其实已经完成了把用户输入写入RAM并验证的操作:
.data段里的storage: .space 80是在进程虚拟内存中开辟的80字节缓冲区,这块虚拟内存最终会被操作系统映射到物理RAM上。- 调用
scanf时,把storage的地址传给r1,scanf会直接把用户输入的字符串写入这块RAM区域。 - 后续调用
printf读取storage地址的内容并打印,这就是验证数据存在的过程——能正常打印就说明数据已经成功存入RAM了。
2. 关于RAM物理地址
现代操作系统都采用虚拟内存机制,用户程序中使用的地址是虚拟地址,并非直接的物理RAM地址。操作系统的MMU(内存管理单元)会自动把虚拟地址映射到物理RAM的实际地址上:
- 普通用户程序没有权限直接访问物理地址,也完全没必要这么做——你的
storage缓冲区对应的虚拟地址已经间接指向物理RAM了。 - 如果一定要操作物理地址,需要编写内核态程序(比如驱动),但这对你的需求来说完全多余。
3. 程序重启后保留RAM数据的可能性
RAM是易失性存储器,只要断电(包括程序关闭后进程内存被释放、系统重启),RAM里的数据就会彻底丢失,没有办法直接让RAM数据在重启后保留。
- 要实现数据持久化,必须把数据写入非易失性存储设备(比如硬盘、闪存)。你可以在程序里添加文件写入逻辑:
- 调用
fopen打开一个文件(比如"input_save.txt")。 - 调用
fprintf把storage里的用户输入写入文件。 - 下次程序启动时,调用
fscanf从文件中读取之前保存的数据。
- 调用
补充:现有代码的小优化建议
你的代码逻辑没问题,不过可以注意两点:
scanf的%s格式会自动在输入末尾加\0,确保字符串正确终止,storage开辟的80字节足够存储大部分短输入。- 如果要读取带空格的输入,需要把
format改成.asciz "%[^\n]s",这样scanf会读取到换行符为止。
内容的提问来源于stack exchange,提问作者powerpuff
相关产品推荐
相关产品推荐

