0

我正在学习 MIPS64 并使用 EduMIPS64 模拟器。

我理解以下示例的说明,我尝试在一个循环后循环执行它,但我不知道编译器如何知道哪个数字或字符串与相应的占位符匹配,以及format_str在本.code节末尾如何与 so 相关,这就足够了把地址放进format_strr14

我知道系统调用期望其参数的地址存储在寄存器 R14 中,但所有其他调用如何与该地址(format_str)相关?

对于每个或占位符,%s都需要一个参数,从前一个的地址开始。当 SYSCALL 找到一个整数参数的占位符时,它期望对应的参数是一个整数值,当它找到一个字符串参数的占位符时,它期望字符串的地址作为参数。%d%iSYSCALL 5

我尝试通过内存表示来理解它,但没有成功。

            .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

谢谢。

4

1 回答 1

2

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

它知道格式字符串和所有其他值在模拟内存 ( fs_addr) 中的位置,因为您在r14. 因此,模拟器可以只获取该地址并将其映射到主机内存中的相应地址,将该地址的前两个字转换为 aconst char*和 a 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<---------+
于 2019-01-08T20:18:49.913 回答