Assembly 编写这个汇编程序
我有一个非常精确的汇编子程序规范: 规格 名称:子例程必须称为hexasc。输入参数:仅限 一个,在寄存器r4中。寄存器r4中的4个最低有效位 指定一个从0到15的数字。中所有其他位的值 必须忽略输入。返回值:仅一个,以 寄存器r2。寄存器r2中的7个最低有效位必须是 ASCII码,如下所述。输出中的所有其他位必须为 零。所需操作:必须将输入值0到9转换为 数字“0”到“9”的ASCII码。输入 必须将值10到15转换为 字母“A”至“F”分别为。副作用:中的值 寄存器r2到r15可以更改。所有其他寄存器必须具有 子例程返回时未更改的值 我可能知道如何制作一个子程序,但我以前从未这样做过。我不知道如何从寄存器中指定4个最低有效位。我不知道如何返回值。我刚刚开始汇编编程,我可以运行但不能真正编写程序。你能给我一些有用的提示吗?处理器手册可用 我能提出的最好的建议是,所有这些我都不明白,因为我从互联网上借用了一些代码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可以更改。所有
.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个指令
祝你好运 谢谢你的回答。我努力更新了这个问题