MIPS以无符号整数计数数字

时间:2013-11-26 03:35:12

标签: assembly mips

用户输入二进制数(即:110100),我需要计算从LSB开始的连续0的数量,所以在110100的情况下它将是2。

我的问题是计算此输入字符串的长度。但我发现这是不可能的,因为我通过

检查
      beqz $t2,finished

即使我们知道这不是字符串的结尾,它也会立即停在110的前0位。

我的尝试:

    ## Read string from user ##
    la $a0, str
    li $a1, 100
    li $v0, 8
    syscall
    ##

    ## Loop each byte in string until null-terminator is found ##
    loop:
        move $t0,$t1
        add $t0,$t0,$a0 # current address($t0)=counter*1(size of character in bytes)+RAM address of start of array

        lb $t2,($t0)    # load next byte in string 

        lw $s0, del

        beqz $t2,finished   # if current character==null-terminator, exit loop

        addi $t1,$t1,1  # increase counter

        beqz $t2,addtoh

        j loop  # loop around

    addtoh:
        addi $t3,$t3,1 #
        j loop  # loop around
    finished:
    ##

#################################################
#                                               #
#               data segment                    #
#                                               #
#################################################

            .data
        str:    .space 100
        endl:   .asciiz "\n"

1 个答案:

答案 0 :(得分:1)

我看不到你在哪里初始化$t1。与高级语言不同,机器代码不会自动初始化内存或寄存器。 $t1可以在任何地方开始。所以当你这样做时:

move $t0,$t1    # unknown 32-bit value loaded into $t0
add $t0,$t0,$a0 # $t0 is now an unknown number of bytes past (or before!) the start of the buffer
lb $t2,($t0)    # load next (random) byte in string 

...你最终可能会在内存空间的任何地方查看字节。由于很多这些字节 最终会为零,因此您的代码将比您预期的更早完成。