我对装配子程序有一个非常精确的规范:
规范
名称:子程序必须被称为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
答案 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指令集之外也可能不那么有用,但它确实给出了一个非常深刻,实用的看法低级系统编程。
答案 2 :(得分:1)
通常,这是通过对高28位进行AND运算并使用左边的内容来索引“0123456789ABCDEF”ASCII查找表来完成的。这就像ARM中的3条指令。
祝你好运!