从 RISC-V 程序集调用时,如何修复 printf 中字符串的长度?

问题描述

我想使用 newlib 在 Spike 上的 pk 之上运行的 RISC-V 程序(程序集)上获得一些输出

我可以使用空终止字符串调用 printf,例如(代码段)

la a0 msg_
jal printf

.data
msg_ .ascii "MESSAGE IS \n"
.equ len_msg_,. - msg_

会打印出 MESSAGE IS - 但是如何将字符串的长度传递给调用?我试过 a1 - a7 并且它似乎不是它们,我也不能把我想要的长度放在堆栈上(我可能只是做错了,但无论如何更多printf 函数似乎做的第一件事是在堆栈中保存大量寄存器,所以我认为这行不通)。

更让我困惑的是,我使用了编译器资源管理器 (https://godbolt.org/z/vscGPG),但我看不到任何长度的任何东西被传递的迹象。我错过了什么?

解决方法

你没有。你空终止 msg

我对这个程序集不是很熟悉,但是你想让它发出一个零字节。其中之一可能是正确的:

msg_ .ascii "MESSAGE IS \n\0"

msg_ .asciz "MESSAGE IS \n"

msg_ .ascii "MESSAGE IS \n"
     .byte  0

在任何情况下你都不需要len_msg_