为了理解SYSCALL 5示例,立即数%占位符的顺序令人困惑

时间:2019-01-08 19:08:08

标签: mips mips64

我正在学习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

谢谢。

1 个答案:

答案 0 :(得分:1)

模拟器实际上不需要了解任何有关占位符的信息。

它知道格式字符串和所有其他值在模拟内存(fs_addr)中的位置,因为您在r14中传递了该地址。因此,模拟器只需获取该地址并将其映射到主机内存中的相应地址,将该地址的前两个字转换为const char*va_list,然后调用{{1 }}。

我不知道这是否是EduMIPS64的实际功能,但这似乎是更简单的解决方案之一。


这显示了示例中每个占位符对应的内容:

vprintf