我可以在很大程度上理解和使用Java / c ++,但是对于我的生活而言,装配让我感到困惑的是我有两个功能我遇到了麻烦。第一:
一个接收字符串并在终端上打印的函数
另一个接收字符串并将其转换为整数的字符串(字符串全部由数字组成)。
关于从哪里开始的任何想法?
更新
关于第二个功能,到目前为止我得到了这个:
main:
atoi:
li $v0, 8
la $a0, tstr
li $a1, 64
syscall
sub $sp, $sp,4
sw $ra, 0($sp)
move $t0, $a0
li $v0, 0
next:
lb $t1, ($t0)
beqz $t1, endloop
mul $v0, $v0, 10
add $v0, $v0, $t1
sub $v0, $v0, 48
add $t0, $t0, 1
b next
endloop:
lw $ra, 0($sp)
add $sp, $sp, 4
更新了代码,仍然将10上的错误视为无效操作数。关于sub $v0, $v0, 48
,我应该只是sub $t1, $t1, 48
吗?
答案 0 :(得分:1)
对于输入输出内容,您必须使用系统调用。对于写入(零终止)字符串,您将使用系统调用#4,它需要缓冲区的地址在$ a0中。现在只需将系统调用的数字放在$ v0中并执行它。例如,此代码段读取字符串:
li $v0, 8 # syscall number
la $a0, theString # buffer
li $a1, 64 # length of buffer
syscall # read!
Here你可以找到一些系统调用号码 对于第二个练习,这里是C ++代码,尝试翻译它:P
int result = 0;
while (*digit >= '0' && *digit <='9') { // digit is char *
result = (result * 10) + (*digit - '0');
digit++;
}
修改强>
好的,有几个错误。首先,您不会检查您是否已到达字符串的末尾(只需将$ t1与0开头比较)。你应该首先减去0&#39; 0&#39; 0从$ t1开始,然后将其添加到$ v0。
next:
lb $t1, ($t0)
# are there other character or this is the last one?
mul $v0, $v0, 10
add $v0, $v0, $t1
sub $v0, $v0, 48 # subtract 48 only from $t1, not from whole result
add $t0, $t0, 1
b next