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

How can I fix the length of a string in printf when called from RISC-V assembly?

我想使用 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 函数似乎做的第一件事就是在堆栈上保存大量寄存器,所以我认为这行不通。

更令我困惑的是,我使用了 Compiler Explorer (https://godbolt.org/z/vscGPG),但我没有看到任何迹象表明正在传递长度的任何内容。我错过了什么?

你不知道。你 null 终止 msg

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

msg_ .ascii "MESSAGE IS \n[=10=]"

msg_ .asciz "MESSAGE IS \n"

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

在任何情况下都不需要len_msg_