Assembly 选择性系统调用和值在简单循环中破碎

Assembly 选择性系统调用和值在简单循环中破碎,assembly,mips32,Assembly,Mips32,这是一个非常简单的循环,尽管在第七个重复中(当通用数量数大于7时,系统调用开始出现错误,并且没有打印“enter_num”标记,也没有在这一点之后的数据段上打印其压碎值)。 我不明白原因 .data .asciiz Amount:"Enter amount of numbers " enter_num:"Enter number " of:" of " space:" " .text la $a1 0x10010000 #Loads address to $a1 #Ask for

这是一个非常简单的循环,尽管在第七个重复中(当通用数量数大于7时,系统调用开始出现错误,并且没有打印“enter_num”标记,也没有在这一点之后的数据段上打印其压碎值)。 我不明白原因



.data
.asciiz

Amount:"Enter amount of numbers " 
enter_num:"Enter number "
of:" of "
space:" "

.text


la $a1 0x10010000 #Loads address to $a1

#Ask for general number amount
la $a0 Amount
li $v0 4
syscall
li $v0 5
syscall

add $t1 $t1 $v0 #store the general amount of numbers in $t1

#Define counter $t2
li $t2 1

#store first general number
sb $t1 0($a1)#store byte in address
addi $a1 $a1 1 #Promote $a2 block address by 1 step

loop:

#Ask for array numbers

la $a0 enter_num
li $v0 4
syscall
la $a0,($t2)
li $v0 1
syscall
la $a0 of
li $v0 4
syscall
la $a0,($t1)
li $v0 1
syscall
la $a0 space
li $v0 4
syscall
li $v0 5
syscall

sb $v0 0($a1)#store byte in address



addi $a1 $a1 1#Promote $a1 address by 1 step

beq $t2 $t1 finish #loop ends when we reach the general amount number

addi $t2 $t2 1#promote $t2 counter

j loop


$a1
指向
0x10010000
,这是数据段(存储ASCII字符串的位置)的基础。通过在其中写入数据,可以有效地覆盖字符串

尝试以下操作:选择30个数字的数量,输入0到数字24,然后输入65到数字25,输入66到数字26,等等。您应该得到如下结果:

Enter number 1 of 30 0
...
Enter number 24 of 30 0
Enter number 25 of 30 65
Anter number 26 of 30 66
ABter number 27 of 30 67
ABCer number 28 of 30 68
ABCDr number 29 of 30 69
ABCDE number 30 of 30 70
65是“A”的ASCII码,66是“B”的ASCII码,等等。您可以看到数据被覆盖

一种解决方案是将您的号码存储在
空格之后

.data

Amount:    .asciiz "Enter amount of numbers "
enter_num: .asciiz "Enter number "
of:        .asciiz " of "
space:     .asciiz " "

numbers:   .space 128   # <- some room for numbers here

.text
.globl main
main:

  #la $a1 0x10010000    # <- replace this...
  la $a1 numbers        # <- ...with this

  # ...rest of the code here...
.data
金额:.asciiz“输入数字金额”
输入编号:.asciiz“输入编号”
of:.asciiz“of”
空间:.asciiz“”

数字:。空格128#
$a1
指向
0x10010000
,这是数据段(存储ASCII字符串的位置)的基础。通过在其中写入数据,可以有效地覆盖字符串

尝试以下操作:选择30个数字的数量,输入0到数字24,然后输入65到数字25,输入66到数字26,等等。您应该得到如下结果:

Enter number 1 of 30 0
...
Enter number 24 of 30 0
Enter number 25 of 30 65
Anter number 26 of 30 66
ABter number 27 of 30 67
ABCer number 28 of 30 68
ABCDr number 29 of 30 69
ABCDE number 30 of 30 70
65是“A”的ASCII码,66是“B”的ASCII码,等等。您可以看到数据被覆盖

一种解决方案是将您的号码存储在
空格之后

.data

Amount:    .asciiz "Enter amount of numbers "
enter_num: .asciiz "Enter number "
of:        .asciiz " of "
space:     .asciiz " "

numbers:   .space 128   # <- some room for numbers here

.text
.globl main
main:

  #la $a1 0x10010000    # <- replace this...
  la $a1 numbers        # <- ...with this

  # ...rest of the code here...
.data
金额:.asciiz“输入数字金额”
输入编号:.asciiz“输入编号”
of:.asciiz“of”
空间:.asciiz“”

数字:.space 128#谢谢,就是这样..虽然我不熟悉这行“.space 128”它到底做什么?这只是在数据段中为数据分配128个连续字节(我随机选择了128个,只要它足够大,可以容纳全局计数器+所有数字)。谢谢,就是这样。。虽然我不熟悉“.space 128”这行,但它到底做了什么?这只是在数据段中为您的数据分配128个连续字节(我随机选择了128个,只要它足够大,可以容纳全局计数器+所有数字)。