问题描述
我是 MIPS 编码的新手(初学者),这是我从手册中发现的一个练习问题。
我已尽力为用户输入的字符串分配堆内存,以便我可以遍历字符串的索引,但我无法弄清楚或进一步处理。
有人可以解释和指导我如何从偶数和奇数索引检索和打印字符用户在 MIPS 中使用 MARS 输入的字符串?
我在下面发布了原始问题以及我尝试的代码。
编写一个 MIPS 程序,提示用户输入一个 16 位的字符串
称为 ~/.bashrc
的字符。然后使用以下代码实现
下面给出循环:
msg
示例输出:
用户输入:for(int j = 0; j < 2; j++) {
for(int i = 0; i < 8; i++) {
print(msg[(i * 2) + j]);
}
}
输出:"Iamhurtverybadly"
这是我到现在为止写的:
"Imuteyalahrvrbdy"
解决方法
让我们为您的程序集编写 C 代码:
for ( int i = 0,j = 0; i < 2; j++ ) {
if ( j < 8 )
i++;
i <<= 1;
int k = i + j;
}
print("Sample Output: \n");
exit();
这行不通,是吗?您只有一个循环(但有两个循环控制变量)。这不遵循原始代码的模型,它有 2 个循环,并且它们是嵌套的,一个完全在另一个中。此外,您通过在循环内加倍来修改 i
变量。
首先,让我们分步复习循环翻译:
for ( int j = 0; j < 2; j++ ) {
... // body of for loop
}
将for循环改为while循环:
int j = 0;
while ( j < 2 ) { // loop top & test
... // body of loop
j++; // loop control resumes after body
}
将while循环改为汇编的if-goto-label样式:
int j = 0;
loop1: // loop top
if ( j >= 2 ) goto loop1Done; // loop test
... // body of loop
j++; // loop control
goto loop1; // continue looping
loop1Done: // loop done,on to next statement after
现在,让我们进行嵌套循环:
for ( int j = 0; j < 2; j++ ) { // loop1
for ( int i = 0; i < 8; i++ ) { // loop2 (also body of loop1)
print ( msg [ i*2+j ] ); // body of loop2
}
}
exit();
将 for 循环改为 while 循环:
int j = 0;
while ( j < 2 ) {
// for loop2 initialization
int i = 0; // <<---- note where i=0 is: inside the outer loop
while ( i < 8 ) { // while loop2 top & test
print ( msg [ i*2+j ] ); // body of loop2
i++; // loop2 control
}
j++; // loop1 control
}
exit();
嵌套的控制结构应该相互独立地翻译。如果一个控制结构在 C 中嵌套在另一个中,那么它应该完全嵌入到另一个在汇编语言中的翻译中。
将while循环改为汇编的if-goto-label样式:
int j = 0;
loop1:
if ( j >= 2 ) goto loop1Done;
// inner for loop2 starts here with initialization
int i = 0; // <<---- note where i=0 is: inside the outer loop
loop2: // while loop2 starts here
if ( i >= 8 ) goto loop2Done;
print ( msg [ i*2+j ] ); // body of loop2
i++; // loop2 resumes
goto loop2;
loop2Done: // end of loop2
j++; // loop1 resumes
goto loop1;
loop1Done: // end of loop1
exit();
你能在上面看到外循环和内循环是如何完全关联的,就像它们在 C 中一样:内循环 (2) 完全嵌套在外循环 (1) 中。
以上内容可以轻松翻译成汇编语言,因此我将其留给读者作为练习。在执行 i
时不要修改 j
或 i*2+j
- 将它们计算到其他未使用的寄存器中。