我正在学习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
谢谢。
答案 0 :(得分:1)
模拟器实际上不需要了解任何有关占位符的信息。
它知道格式字符串和所有其他值在模拟内存(fs_addr
)中的位置,因为您在r14
中传递了该地址。因此,模拟器只需获取该地址并将其映射到主机内存中的相应地址,将该地址的前两个字转换为const char*
和va_list
,然后调用{{1 }}。
我不知道这是否是EduMIPS64的实际功能,但这似乎是更简单的解决方案之一。
这显示了示例中每个占位符对应的内容:
vprintf