Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 无符号整数中的数字计数_Assembly_Mips - Fatal编程技术网

Assembly 无符号整数中的数字计数

Assembly 无符号整数中的数字计数,assembly,mips,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

用户输入一个二进制数(即: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"

我看不到您在哪里初始化
$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 

。。。您可能会在内存空间的任何位置查看字节。而且,由于这些字节中的许多字节最终将为零,因此您的代码将比您预期的更快完成。

我看不出您在哪里初始化
$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 

。。。您可能会在内存空间的任何位置查看字节。而且,由于这些字节中的许多字节最终将为零,因此您的代码将比您预期的更快完成。

文本字符
'0'
编码为48(十进制),而不是0(ASCII/UTF-8/您可能使用的任何字符集)。如果有人输入字符序列
'1',1',0',1',0',0'
(作为六个相邻字节),它们分别是49,49,48,49,48和48。但是,
read
系统调用(我假设在
v0
中的syscall#8是
read
)可能首先返回读取的字节数,而不是创建以零字节结尾的字符串。虽然它们不是以ASCII(48和49s)读取的,但它们被读取为0和1s,如何修复此问题?您从用户交互设备、文件系统中的文件中读取什么?哪个操作系统正在处理
syscall
指令?syscall#8在哪个寄存器中返回什么返回值?Windows。我正在读取一个字符串(syscall 8),将该地址存储在$a0中,然后读取字符串中的每个字符,加载字节(每个字符1字节)lb$t2,($t0)已解决,参数寄存器$a0损坏了我的数据,因此我在循环字符串之前将$a0移动到临时寄存器。文本字符
'0'
为(在ASCII/UTF-8/您可能使用的任何字符集中)编码为48(十进制),而不是0。如果有人输入字符序列
'1','0','1','0','0'
(作为六个相邻字节),它们分别是49,49,48,49,48和48。但是,
读取
系统调用(我假设syscall#8在
v0
中是
read
)可能首先返回读取的字节数,而不是创建以零字节结尾的字符串。它们不是以ASCII(48和49s)读取的但是,它们被读取为0和1,我如何解决这个问题?您从用户交互设备读取的是什么,文件系统上的文件?什么操作系统正在处理
syscall
指令?syscall#8在哪个寄存器中返回什么返回值?Windows。我正在读取字符串(syscall 8),将该地址存储在$a0中,然后读取字符串中的每个字符,加载字节(每个字符1字节)lb$t2,($t0)已解决,参数寄存器$a0损坏了我的数据,因此我在循环字符串之前将$a0移动到临时寄存器。那么,当输入“foo110100bar”而不是像“110100”这样的字符串时,它会生成什么是1,“0”是0,什么是“f”或“o”?解决了,参数寄存器$a0损坏了我的数据,所以我在循环字符串之前将$a0移动到临时寄存器。那么,当输入“foo110100bar”而不是“110100”这样的字符串时,它会生成什么?如果“1”是1,“0”是0,那么“f”或“o”是什么?已解决,参数寄存器$a0损坏了我的数据,因此我在循环字符串之前将$a0移动到临时寄存器。