询问该MIPS代码是否存在地址越界问题及代码功能解析
MIPS代码功能与问题分析
代码功能
这段代码试图实现滑动窗口三数求和的逻辑:
- 初始从
array数组取前3个值(均为1),将三者之和存入当前窗口起始位置往后第4个元素的地址; - 把窗口起始地址后移4字节(一个
word的长度),重复求和存储操作,总共执行25次循环。
具体执行流程:
.data段定义了连续的两个数据区域:array是3个初始值为1的word(占12字节),tmp是25个初始为0的word(占100字节);- 主函数将
array的起始地址加载到$t0,设置循环计数器$t1为25; - 每次循环内:
- 从
$t0、$t0+4、$t0+8三个地址读取三个整数; - 累加三个数得到总和;
- 将总和存入
$t0+12的地址; - 窗口地址
$t0后移4字节,计数器减1,直到计数器为0时退出程序。
- 从
存在的问题:确实存在严重地址越界
你的怀疑完全正确,这段代码会出现多次地址越界访问,具体情况如下:
- 存储越界:第一次循环时,
sw $t2, 12($t0)会把数据存入array+12(即tmp的起始地址),这还在分配的空间内。但循环执行25次后,$t0会移动到array + 4*25 = array+100,此时12($t0)指向array+112,而array加tmp总共仅占112字节,该地址已超出分配的.data段空间; - 加载越界:循环到后期时,比如第23次循环,
$t0为array+92,此时lw $t5, 8($t0)会访问array+100——这已经是tmp最后一个元素之后的地址,属于越界读取;后续循环的加载操作会持续访问超出分配空间的内存。
此外,循环次数设置完全不合理:算上array和tmp的总空间,最多仅能执行23次有效循环(保证$t0+8不越界),硬写25次循环直接触发了越界问题。
内容的提问来源于stack exchange,提问作者SiHan.Z
相关产品推荐
相关产品推荐

