Assembly 编写这个汇编程序

Assembly 编写这个汇编程序,assembly,mips,nios,Assembly,Mips,Nios,我有一个非常精确的汇编子程序规范: 规格 名称:子例程必须称为hexasc。输入参数:仅限 一个,在寄存器r4中。寄存器r4中的4个最低有效位 指定一个从0到15的数字。中所有其他位的值 必须忽略输入。返回值:仅一个,以 寄存器r2。寄存器r2中的7个最低有效位必须是 ASCII码,如下所述。输出中的所有其他位必须为 零。所需操作:必须将输入值0到9转换为 数字“0”到“9”的ASCII码。输入 必须将值10到15转换为 字母“A”至“F”分别为。副作用:中的值 寄存器r2到r15可以更改。所有

我有一个非常精确的汇编子程序规范:

规格

名称:子例程必须称为hexasc。输入参数:仅限 一个,在寄存器r4中。寄存器r4中的4个最低有效位 指定一个从0到15的数字。中所有其他位的值 必须忽略输入。返回值:仅一个,以 寄存器r2。寄存器r2中的7个最低有效位必须是 ASCII码,如下所述。输出中的所有其他位必须为 零。所需操作:必须将输入值0到9转换为 数字“0”到“9”的ASCII码。输入 必须将值10到15转换为 字母“A”至“F”分别为。副作用:中的值 寄存器r2到r15可以更改。所有其他寄存器必须具有 子例程返回时未更改的值

我可能知道如何制作一个子程序,但我以前从未这样做过。我不知道如何从寄存器中指定4个最低有效位。我不知道如何返回值。我刚刚开始汇编编程,我可以运行但不能真正编写程序。你能给我一些有用的提示吗?处理器手册可用

我能提出的最好的建议是,所有这些我都不明白,因为我从互联网上借用了一些代码

        .global main 

        .text
        .align 2

main:   movi r8, 0x09
        movi r9, 0x0f

        andi r4, r4, 0x0f

        bgt r8, r4, L1  

        movi r2, 0x1e
        add r2, r2, r4  
        andi r2, r2, 0xff

        movia   r2,putchar
        br  L2  

L1:     movi r2, 0x29   
        add r2, r2, r4
        andi r2, r2, 0xff

        movia   r2,putchar

L2:  .end 
我已经对代码进行了注释,但我认为它不符合规范,因为它不是一个子程序,我不确定转换算法是否正确实现:

        .global hexasc 

        .text
        .align 2

hexasc: movi r8, 0x09       #we are going to use the decimal number 9
        movi r9, 0x0f       #we also will use decimal number 15

        andi r4, r4, 0x0f   #keep only last 4 bits of what is in r4

        bgt r8, r4, L1      #go to L1 if 9 > x

        movi r2, 0x1e       #use decimal number 30
        add r2, r2, r4      #add 30 and what is in r4
        andi r2, r2, 0xff

        movia   r2,putchar
        br  L2  

L1:     movi r2, 0x29        #this is reached iff 9 > x
        add r2, r2, r4
        andi r2, r2, 0xff

        movia   r2,putchar

L2:  .end 

对于其中的一些要点,您可能会过度考虑此赋值/汇编与其他结构化编程术语。在汇编程序中(一般来说),子例程只是一段可以独立运行的代码。例如,我在整个汇编过程中一直重复使用的一个子程序是一个子程序,用于获取写入闪存的字符串,并通过串行连接发送它(或多或少,一个常量字符串可能……您很快就会找到它)。我个人使用.macro指令编写了这些子例程,以使代码更“程序化”

返回值仅如问题所示:

返回值:仅一个,在寄存器r2中返回。寄存器r2中的7个最低有效位必须是ASCII码,如下所述

这意味着无论程序的适当输出是什么,它都应该在寄存器r2中

我将从熟悉本文档开始,从实际编码的角度出发:

最后,当我上这门课时,我们使用了Atmel AVR处理器,这本书是迄今为止我所见过的最完整、最容易阅读的汇编编程入门书之一。。。再一次,我很幸运能和写这本书的教授一起上课。。。在AVR指令集之外,它也可能没有那么有用,但它确实对低级系统编程提供了非常深入、实用的视角


对于其中的一些要点,您可能会过度考虑此赋值/汇编与其他结构化编程术语。在汇编程序中(一般来说),子例程只是一段可以独立运行的代码。例如,我在整个汇编过程中一直重复使用的一个子程序是一个子程序,用于获取写入闪存的字符串,并通过串行连接发送它(或多或少,一个常量字符串可能……您很快就会找到它)。我个人使用.macro指令编写了这些子例程,以使代码更“程序化”

返回值仅如问题所示:

返回值:仅一个,在寄存器r2中返回。寄存器r2中的7个最低有效位必须是ASCII码,如下所述

这意味着无论程序的适当输出是什么,它都应该在寄存器r2中

我将从熟悉本文档开始,从实际编码的角度出发:

最后,当我上这门课时,我们使用了Atmel AVR处理器,这本书是迄今为止我所见过的最完整、最容易阅读的汇编编程入门书之一。。。再一次,我很幸运能和写这本书的教授一起上课。。。在AVR指令集之外,它也可能没有那么有用,但它确实对低级系统编程提供了非常深入、实用的视角


由于这是家庭作业,编写代码是您自己的任务,但也许这可以帮助您:

如果你有一个任意大小的寄存器,只想从其中登记特定的位,考虑和使用掩码。例如,对于7个最低有效位

11111101 AND 01111111 => 01111101
关于我不知道如何返回值,答案写在您的作业中:

返回值:仅一个,在寄存器r2中返回


在例程结束之前,只需将您想要返回的内容存储在寄存器r2中。

因为这是家庭作业,所以编写代码是您自己的任务,但这可能会帮助您:

如果你有一个任意大小的寄存器,只想从其中登记特定的位,考虑和使用掩码。例如,对于7个最低有效位

11111101 AND 01111111 => 01111101
关于我不知道如何返回值,答案写在您的作业中:

返回值:仅一个,在寄存器r2中返回


在例程结束之前,只需在寄存器r2中存储您想要返回的任何内容。

通常,这是通过将较高的28位进行ANDing,然后使用剩余的内容索引“0123456789ABCDEF”ASCII查找表来完成的。就像手臂上的3个指令


祝你好运

通常,这是通过将上面的28位进行ANDing运算并使用剩下的内容索引“0123456789ABCDEF”ASCII查找表来完成的。就像手臂上的3个指令


祝你好运

谢谢你的回答。我努力更新了这个问题