首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为了理解SYSCALL 5示例,文本%占位符的顺序令人困惑

为了理解SYSCALL 5示例,文本%占位符的顺序令人困惑
EN

Stack Overflow用户
提问于 2019-01-08 19:08:08
回答 1查看 177关注 0票数 0

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

我理解下面示例的说明,我试着一次又一次地执行它,但我不知道编译器如何知道哪个数字或字符串匹配到相应的占位符,以及它们与format_str的关系如何,所以在.code部分的末尾,足够将format_str的地址放在r14

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

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

我试着用记忆表示法来理解它,但没有成功。

代码语言:javascript
复制
            .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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-01-08 20:18:49

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

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

我不知道这是否是EduMIPS64真正做的,但这似乎是一个更简单的解决方案。

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

代码语言:javascript
复制
"%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<---------+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54098162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档