我正在学习MIPS64,并使用EduMIPS64模拟器。
我理解下面示例的说明,我试着一次又一次地执行它,但我不知道编译器如何知道哪个数字或字符串匹配到相应的占位符,以及它们与format_str的关系如何,所以在.code部分的末尾,足够将format_str的地址放在r14中
我知道系统调用期望将其参数的地址存储在寄存器R14中,但其他所有参数与此地址(format_str)的关系如何?
对于每个
%s、%d或%i占位符,SYSCALL 5需要一个参数,从上一个参数的地址开始。当SYSCALL为整数参数找到占位符时,它期望相应的参数是整数值,如果它为字符串参数找到占位符,它将字符串的地址作为参数。
我试着用记忆表示法来理解它,但没有成功。
.data
format_str: .asciiz "%dth of %s:\n%s version %i.%i is being tested!"
s1: .asciiz "June"
s2: .asciiz "EduMIPS64"
fs_addr: .space 4
.word 5
s1_addr: .space 4
s2_addr: .space 4
.word 0
.word 5
test:
.code
daddi r5, r0, format_str
sw r5, fs_addr(r0)
daddi r2, r0, s1
daddi r3, r0, s2
sd r2, s1_addr(r0)
sd r3, s2_addr(r0)
daddi r14, r0, fs_addr
syscall 5
syscall 0谢谢。
发布于 2019-01-08 20:18:49
模拟器实际上不需要了解占位符的任何信息。
它知道格式字符串和所有其他值位于模拟内存(fs_addr)中的位置,因为您在r14中传递了该地址。因此模拟器只需将该地址映射到主机内存中的相应地址,将该地址的前两个单词转换为一个const char*和一个va_list,然后调用vprintf。
我不知道这是否是EduMIPS64真正做的,但这似乎是一个更简单的解决方案。
这显示了示例中的每个占位符对应的内容:
"%dth of %s:\n%s version %i.%i is being tested!"
| | | | |
| | | | +-+
| | | +-+ |
| | +----------+ | |
| +-------------+ | | |
+--------->.word 5 | | | |
| | | |
s1_addr: .space 4<-+ | | |
s2_addr: .space 4<---+ | |
.word 0<------+ |
.word 5<---------+https://stackoverflow.com/questions/54098162
复制相似问题