我对汇编子程序有一个非常精确的规范:
规格
名称:子程序必须叫 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