首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在EDUMIPS64模拟器中打印数组或格式化字符串?

如何在EDUMIPS64模拟器中打印数组或格式化字符串?
EN

Stack Overflow用户
提问于 2017-05-02 02:43:25
回答 1查看 884关注 0票数 0

这个程序的文档非常有限。为了做到这一点,我几乎找不到任何东西。除了该程序的PDF文件外,只有以下内容:

代码语言: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

你可以去看看这里。EDU/WINMIPS64 64与常规MIPS组装有很大不同。

有几个段落解释了这一点,但没有多大帮助。无论如何,这里会打印一个格式化的字符串,以及一些字符串参数(存储在s1和s2中)和整数参数(它们存储在哪里?)。

我有两个数组存储在内存中。我亲自执行了他们的指示,现在我想打印他们。如何在这样一个格式化的字符串上提供这两个整数(它们是双单词,即。需要存储8个字节)?帮助材料不能解释。

到目前为止,我已经创建了这段代码(注释很重):

代码语言:javascript
复制
....
dadd $s4, $zero, $zero                  ; i = 0
printOutput:                                    ; print results from the 2 arrays
        beq $s4, 960, end                       ; if (i = size = 960 / 8) goto end
        dadd $s1, $s4, $s2                      ; full address of 1st array
        dadd $s0, $s4, $s3                      ; full address of 2nd array

        daddi $a3, $zero, printString           ; address ofstring to be printed stored in $a3
        ld $v0, 0($s1)                          ; $v0 will be used to print 1st array[i]. Is this right?
        ld $v1, 0($s2)                          ; $v1 will be used to print 2nd array[i]. Is this right? Which register to use for supplying a formatted string to print integers? It is not explained anywhere! 
        dadd $14, $zero, $a3                    ; print string. $14 is the register to syscall instructions. But i'm just guessing with this. I really don't know how it should handle. I just supplied $a3 because it seems more intuitive.

        syscall 5                               ; prints ouput (on the MEM stage)
        daddi $s4, $s4, 8                       ; i++
        j printOutput
end:

如果有人知道怎么做的话,如果他/她能分享的话,我会非常高兴的。任何地方都没有这样的例子。谢谢。

更新

在迈克尔的帮助下,通过反复试验,我发现了问题的主要原因。我们为输出字符串和其他内存地址提供标签的顺序非常敏感。经过反复试验,我发现我们必须服从以下命令:

代码语言:javascript
复制
.data
format_string .asciiz "%d and %i etc.."
start_address .space  4
syscallArg1   .space  4                   ; 1st parameter to syscall 5
syscallArg2   .space  4                   ; 2nd parameter to syscall 5
---other labels go here---
.text
---code---

注意,我们必须向$14提供start_address标签,它不能包含任何内容(只是一些可用的空空间)。在此之前,格式化的字符串必须执行,而在此之后,syscall 5的参数必须位于。其他的标签可以是事后的,也可以是在所有这些之前。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-02 09:26:35

手册说的是,您应该在连续内存中存储格式字符串的地址,后面跟着零个或多个参数(例如整数或字符串地址),然后在执行r14之前将该内存的起始地址加载到sycall 5中。

他们的示例代码在我看来有点不正确,因为他们应该使用sw而不是sd在内存中存储r2r3 (假设字符串地址实际上适合32位)。

因此,您需要在data部分中预留一些空间,然后先存储格式字符串的地址,然后再存储任何参数。然后将该内存的起始地址放在r14中。例如,如果您的格式字符串是"%d, %d",并且要打印的两个值以r2r3表示,则在存储格式字符串地址之后直接使用sw r2r3

例如:

代码语言:javascript
复制
.data
format_str: .asciiz "%d"
printf_args: .space 8
...
.code
daddi r5, r0, format_str
sw r5, printf_args(r0)
daddi r5, r0, 123
sw r5, printf_args+4(r0)
daddi r14, r0, printf_args
syscall 5
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43729250

复制
相关文章

相似问题

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