0

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

规格

名称:子程序必须叫 hexasc。输入参数:只有一个,在寄存器 r4 中。寄存器 r4 中的 4 个最低有效位指定一个从 0 到 15 的数字。输入中所有其他位的值必须被忽略。返回值:只有一个,在寄存器r2中返回。寄存器 r2 中的 7 个最低有效位必须是如下所述的 ASCII 码。输出中的所有其他位必须为零。所需操作:输入值 0 到 9 必须分别转换为数字“0”到“9”的 ASCII 代码。输入值 10 到 15 必须分别转换为字母“A”到“F”的 ASCII 代码。副作用:寄存器 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 
4

3 回答 3

3

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

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

11111101 AND 01111111 => 01111101

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

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

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

于 2012-08-20T14:58:13.877 回答
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

于 2012-08-20T14:52:59.023 回答
1

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

祝你好运!

于 2012-08-22T09:00:00.280 回答