编写这个汇编程序

时间:2012-08-20 14:25:42

标签: assembly mips nios

我对装配子程序有一个非常精确的规范:

  

规范

     

名称:子程序必须被称为hexasc。输入参数:仅   一,在寄存器r4。寄存器r4中的4个最低有效位   指定一个从0到15的数字。所有其他位的值   必须忽略输入。返回值:只有一个,返回   注册r2。寄存器r2中的7个最低有效位必须是a   ASCII码如下所述。输出中的所有其他位必须是   零。必需的操作:必须将输入值0到9转换为   数字'0'到'9'的ASCII码分别为。输入   值10到15必须转换为ASCII码   字母'A'到'F'分别。副作用:中的值   寄存器r2到r15可能会改变。所有其他寄存器必须有   子程序返回时值不变。

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

我能提议的最好的,因为我从互联网上借用了一些代码,所以我不理解的是

        .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 

3 个答案:

答案 0 :(得分:3)

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

如果您有一个任意大小的寄存器,并且只想要它的特定位,请考虑使用掩码进行AND运算。例如,对于7个最低有效位

11111101 AND 01111111 => 01111101

关于我不知道如何返回值,答案写在你的作业中:

  

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

在日常工作结束前,只需在寄存器r2中存储您想要返回的内容。

答案 1 :(得分:1)

对于其中一些要点,您可能会过度考虑此任务/程序集与其他结构化编程术语。在汇编(通常)中,子例程就是这样 - 一段可以独立运行的代码片段。例如,我在整个程序集中一直重复使用的子程序之一是一个子程序,用于将字符串写入闪存并通过串行连接发送(或多或少,一个常量字符串cout ......你很快就会得到它足够)。我个人使用.macro指令编写了这些子程序,以便对代码有一种更“程序化”的感觉......

返回值仅仅是问题所暗示的:

  

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

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

从实际编码的角度来看,我首先要熟悉这个文档: http://www.altera.com/literature/hb/nios2/n2cpu_nii51017.pdf

最后,当我上这门课时,我们使用了Atmel AVR处理器和本书,这本书是迄今为止我见过的最完整,易读的“初学者”装配编程书籍之一。那么,我很幸运能够和写这本书的教授一起上课......而且它在AVR指令集之外也可能不那么有用,但它确实给出了一个非常深刻,实用的看法低级系统编程。

http://www.amazon.com/Some-Assembly-Required-Microcontroller-ebook/dp/B007IVDXVM/ref=cm_cr_pr_product_top

答案 2 :(得分:1)

通常,这是通过对高28位进行AND运算并使用左边的内容来索引“0123456789ABCDEF”ASCII查找表来完成的。这就像ARM中的3条指令。

祝你好运!