MIPS汇编doLoop段有效地址计算及add $t1,$t1,$t0指令作用问询
问题解答
1. 有效地址(Effective Address)的定义
有效地址指的是CPU执行内存读写操作时,实际要访问的内存单元的逻辑地址。在数组操作的场景下,有效地址的通用计算公式为:有效地址 = 数组首地址 + 元素下标 × 单个元素占用的字节数
你提供的MIPS代码中,lines是存储10个word类型元素的数组,每个word占4字节,数组里存的是用户输入字符串的堆空间首地址。
2. 有效地址计算对项目数组的影响
计算得到的有效地址,就是lines数组第counter个元素的实际存储地址。后续的sw $v0, ($t1)指令,会把strdup返回的用户输入字符串的首地址,写入到这个地址对应的内存单元中,也就是完成lines[counter] = 字符串地址的赋值操作。
如果有效地址计算错误,会直接导致数组赋值异常:要么写到数组外的内存空间触发访问错误,要么覆盖数组其他元素的值,后续打印阶段就会出现乱码、缺行、程序崩溃等问题。
3. add $t1, $t1, $t0指令的含义
我们先看这行指令前后的上下文代码:
lw $t0, counter # 把当前计数器的值加载到t0,比如第一次循环是0,第二次是1 sll $t0, $t0, 2 # 左移2位等价于乘以4,得到数组元素的偏移量(因为每个word占4字节) la $t1, lines # 把lines数组的首地址加载到t1 add $t1, $t1, $t0 # 数组首地址 + 偏移量 = 第counter个元素的有效地址,存回t1 sw $v0, ($t1) # 把字符串地址写入对应数组元素
这行加法的作用就是把数组首地址和偏移量相加,得到当前要操作的数组元素的有效地址。我们可以举个实际例子辅助理解:
假设lines数组的首地址是0x10010000,当前counter的值是2,那么:
t0加载到的counter值为2sll之后t0 = 2 * 4 = 8- 执行
add后t1 = 0x10010000 + 8 = 0x10010008,正好是lines数组下标为2的元素的存储地址 - 后续
sw就会把第三个用户输入的字符串地址存到lines[2]的位置
内容的提问来源于stack exchange,提问作者Jacob Zheng
相关产品推荐
相关产品推荐

