Python 在MIPS中写入一个函数,该函数将表示整数(以给定基数)的字符串转换为以10为基数的相应数字

Python 在MIPS中写入一个函数,该函数将表示整数(以给定基数)的字符串转换为以10为基数的相应数字,python,recursion,assembly,mips,Python,Recursion,Assembly,Mips,假设我们有一个字符串,表示给定基中的一个整数,而正是这个基。 参数是$a0中存储字符串的起始地址,以及$a1中的基地址 我应该将相应的数字转换为基数10,并将其保存在$v0中。在这种情况下,0应该加载到$v1中。如果字符串不能正确地表示给定基中的整数,那么最后$v0应该包含-1,$v1应该包含1 此外,实际执行转换的函数应该是递归的 我预先编写了一个Python程序,您会注意到各种各样的s0、s1等,我可以将想法转移到MIPS,但当我意识到我可能应该在上下文中执行字符串字符计数时,它变得非常混乱

假设我们有一个字符串,表示给定基中的一个整数,而正是这个基。 参数是$a0中存储字符串的起始地址,以及$a1中的基地址

我应该将相应的数字转换为基数10,并将其保存在$v0中。在这种情况下,0应该加载到$v1中。如果字符串不能正确地表示给定基中的整数,那么最后$v0应该包含-1,$v1应该包含1

此外,实际执行转换的函数应该是递归的

我预先编写了一个Python程序,您会注意到各种各样的s0、s1等,我可以将想法转移到MIPS,但当我意识到我可能应该在上下文中执行字符串字符计数时,它变得非常混乱,对字符串是否在基中进行调查,和实际转换,将数量逐渐相加到某个指定变量,而不是像下面的程序那样分开

我应该如何处理这个问题并编写函数

下面是Python代码:

digitsDict = dict();

lowerCase = "abcdefghijklmnopqrstuvwxyz"
upperCase = lowerCase.upper();

for i in range(26):
    digitsDict.update({lowerCase[i]:i+10})
    digitsDict.update({upperCase[i]:i+10})

def isInBase(string, base):
    s1 = False; 
    for char in string:
        if (str(char).isdigit()):
            if (int(char) >= base):
                return s1
        else:
            if (char not in digitsDict.keys() or digitsDict[char] >= base):
                return s1
    s1 = True
    return s1

def convert(string, base, k=0):
    s2 = 0
    char = string[k]
    l = len(string) - 1
    if str(char).isdigit(): s2 += int(char)*(base**(l-k))
    else:   s2 += digitsDict[char]*(base**(l-k))
    
    if k == l: return s2;
    return s2 + convert(string, base, k+1)
    

def strToInt(string, base):
    return (convert(string, base, 0), 0)
    
def main(a0String, a1Integer):
    if isInBase(a0String, a1Integer):
        v0, v1 = strToInt(a0String, a1Integer)
    else: v0 = -1; v1 = 1;
    
    print(v0)
    if (v0 == -1): return 22 #MIPS error code for invalid argument
    return 0 #OK

首先,你有伪代码,所以很好

接下来,作为一般规则,请确保您的伪代码实际工作,以便对其进行测试,因为调试汇编中的设计问题非常困难,并且对伪代码中的设计进行小的更改可能需要对汇编进行大的更改,例如重写大量代码

您正在用Python做一些与汇编语言相关的事情,所以您应该首先用C编写伪代码,因为这将使您能够解决这些差异

in-表示C或程序集中的循环 +=和+在字符串上-表示全局缓冲区上的一些简单操作,或者表示一些复杂的内存管理提示:使用前者 .isDigit是条件合取或析取,具体取决于编码方式 。更新将需要一些替代翻译 **还表示C或程序集中的循环 下一个大的复杂问题是函数调用。由于寄存器使用和堆栈处理的要求,MIPS汇编语言中的函数调用可能是最复杂的主题

对于汇编语言来说,递归有点像是转移视线:它看起来很难,但实际上并不难,甚至在汇编语言中与调用其他函数而不涉及递归的函数没有什么不同假设汇编指令集有一个用于函数调用的运行时堆栈,MIPS可以,但如果没有,则必须模拟调用堆栈

你需要对此进行研究,这有点牵扯其中。看看其他的例子,比如斐波那契

当将一个调用另一个函数的函数转换为MIPS时,我们需要对函数调用中的变量和值进行分析。这些变量需要特别考虑,因为调用另一个函数会删除一些寄存器。例如,您将在fibonacci中看到这一点

递归fib的一部分是fibn-1+fibn-2。对fib的第一次调用的返回值必须进行特殊处理,因为它最终需要加法+,因此它在对fib的第二次调用中是实时的,如果没有特殊处理,将在进行第二次调用时丢失。此外,n在第一次调用中处于活动状态,但仍需要再次进行第二次调用,并且如果没有一些特殊处理,第一次调用也同样会消除n

这是函数调用MIPS中的函数的结果,这些函数的指令集不会自动堆叠内容,并且需要汇编语言程序员或编译器手动执行。其他体系结构也需要部分或全部这类操作。这不是递归的结果,因此+bn将涉及对变量和值的分析和特殊处理的相同要求

当你有了一个好的算法,例如C语言,并且它可以工作时,你就可以开始汇编了。首先翻译你的数据:全局变量。然后翻译函数,类似地:将你的局部变量翻译成MIPS,然后翻译每个结构化语句,例如,如果,嵌套的结构化语句也嵌套在汇编语言中,只要您严格遵守嵌套规则,您是先翻译内部语句还是先翻译外部语句都无所谓

为了将结构化语句翻译成汇编,我首先使用C语言中的中间形式,例如:

for ( int i = 0; i < n; i++ ) {
    ..body of for..
}
接下来,如果转到标签中间形式,则应用:

    ...
    int i = 0;
loop1:
    if ( i >= n ) goto endLoop1;
    ..body of for..
    i++;
    goto loop1;
endLoop1:
    ...
应用模式时,需要创建标签名称;模式的每个应用程序的新标签名称

如果for的主体也有控制结构,则确保它们的整个转换嵌入并位于上述模式中for部分的主体中

请注意 汇编中的=n-这里是因为if goto label form make中的控制流是这样的:在C中while语句逻辑相反的条件下退出循环


最后,将C代码中语句中的表达式翻译成汇编。

首先,您有伪代码,非常好

接下来,作为一般规则,请确保您的伪代码实际工作,以便对其进行测试,因为调试汇编中的设计问题非常困难,并且对伪代码中的设计进行小的更改可能需要对汇编进行大的更改,例如重写大量代码

您正在用Python做一些与汇编语言相关的事情,所以您应该首先用C编写伪代码,因为这将使您能够解决这些差异

in-表示C或程序集中的循环 +=和+在字符串上-表示全局缓冲区上的一些简单操作,或者表示一些复杂的内存管理提示:使用前者 .isDigit是条件合取或析取,具体取决于编码方式 。更新将需要一些替代翻译 **还表示C或程序集中的循环 下一个大的复杂问题是函数调用。由于寄存器使用和堆栈处理的要求,MIPS汇编语言中的函数调用可能是最复杂的主题

对于汇编语言来说,递归有点像是转移视线:它看起来很难,但实际上并不难,甚至在汇编语言中与调用其他函数而不涉及递归的函数没有什么不同假设汇编指令集有一个用于函数调用的运行时堆栈,MIPS可以,但如果没有,则必须模拟调用堆栈

你需要对此进行研究,这有点牵扯其中。看看其他的例子,比如斐波那契

当将一个调用另一个函数的函数转换为MIPS时,我们需要对函数调用中的变量和值进行分析。这些变量需要特别考虑,因为调用另一个函数会删除一些寄存器。例如,您将在fibonacci中看到这一点

递归fib的一部分是fibn-1+fibn-2。对fib的第一次调用的返回值必须进行特殊处理,因为它最终需要加法+,因此它在对fib的第二次调用中是实时的,如果没有特殊处理,将在进行第二次调用时丢失。此外,n在第一次调用中处于活动状态,但仍需要再次进行第二次调用,并且如果没有一些特殊处理,第一次调用也同样会消除n

这是函数调用MIPS中的函数的结果,这些函数的指令集不会自动堆叠内容,并且需要汇编语言程序员或编译器手动执行。其他体系结构也需要部分或全部这类操作。这不是递归的结果,因此+bn将涉及对变量和值的分析和特殊处理的相同要求

当你有了一个好的算法,例如C语言,并且它可以工作时,你就可以开始汇编了。首先翻译你的数据:全局变量。然后翻译函数,类似地:将你的局部变量翻译成MIPS,然后翻译每个结构化语句,例如,如果,嵌套的结构化语句也嵌套在汇编语言中,只要您严格遵守嵌套规则,您是先翻译内部语句还是先翻译外部语句都无所谓

为了将结构化语句翻译成汇编,我首先使用C语言中的中间形式,例如:

for ( int i = 0; i < n; i++ ) {
    ..body of for..
}
接下来,如果转到标签中间形式,则应用:

    ...
    int i = 0;
loop1:
    if ( i >= n ) goto endLoop1;
    ..body of for..
    i++;
    goto loop1;
endLoop1:
    ...
应用模式时,需要创建标签名称;模式的每个应用程序的新标签名称

如果for的主体也有控制结构,则确保它们的整个转换嵌入并位于上述模式中for部分的主体中

注意汇编中的i=n-这里是因为if-goto-label表单make中的控制流是这样的:在C中while语句的逻辑相反条件下退出循环


最后,将C代码中语句中的表达式翻译成汇编语言。

你的问题是什么?@Michael:我请求帮助编写MIPSOpen结尾的函数,还有一些模糊的问题,比如有人能帮忙吗?不适用于堆栈溢出。你应该围绕一个特定的问题来制定一个问题。你的问题是什么?@Michael:我在请求帮助以MIPSOpen结尾的模糊问题来编写函数,比如有人能帮忙吗?不适用于堆栈溢出。你应该围绕一个特定的问题制定一个问题。