Assembly 无符号整数中的数字计数
用户输入一个二进制数(即:110100),我需要计算从LSB开始的连续0的数量,因此在110100的情况下它将是2 我的问题是计算输入字符串的长度。但我发现这是不可能的,因为我是通过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
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移动到临时寄存器。