好的,所以我有一个简单的程序,其中给定一个整数作为用户的输入,假设它的X,试图在字符串中的X位置找到字符。工作正常,但是有一点bug。因为它容易看,字符串长度是26,所以如果用户输入例如0-> a必须打印,所以它确实如此。但是如果我输入一个大于25的数字(因为第一个字符在第0位)没有出现错误......例如,如果我输入40,我得到一个结果字符e ...有人可以帮助我吗? As.Here是我的代码:
.text
.globl main
main:
li $s3,26 #string length
la $a0, str1 # Load and print string asking for integer
li $v0, 4
syscall
li $v0,5
syscall
add $s0 ,$v0, $zero #integer now in $s0
la $a1,str #address of string now is $a1
addu $a1,$a1,$s0 # $a1 = &str[x]. assumes x is in $s0
lbu $a0,($a1) # read the character
li $v0,11
syscall # and print it
li $v0,10
syscall
.data
str: .asciiz "abcdefghijklmnopqrstuvwzyz"
str1: .asciiz "give an integer: "
答案 0 :(得分:1)
处理器将读取您告诉它要读取的任何内存位置(条形码访问权限)。 40
的索引已从内存中的 next 字符串中选出'e'
str1: .asciiz "give an integer: "
最好的方法是检查输入数字的范围。汇编语言没有高级杠杆语言所具有的内置安全措施 - 只有内存访问限制,在硬件中实现。
编辑: 处理器中的其他内置安全措施,但它们不是"语言"导向。处理器可能有一个监视器,需要定期踢,以确保程序没有卡在程序员不想要的地方。 除以零是另一回事。但处理器的响应是残酷的,根本无法帮助程序的逻辑流程。
通常,处理程序集程序的唯一错误是由asembler本身拾取,以及您在程序中编码的内容。因此,如果您想要超出范围索引的错误 - 这是您的工作。
这些是高级语言发展的基本原因。