mips中la皮带Li和la关系i什么意思,比如la $a0,n

在pmon中判断当前的代码是在flash中运行还是在ram运行如下:

在这里我们假设uncached相对于代码开始的偏移为offset1,locate相对于代码开始的偏移为offset2

现在我们是从spi-flash中启动,所以PC的地址是从0xbfc00000开始的而代码链接的时候,地址则是从0x开始的

所以再执行“subu   s0,ra,s0”之后,就可以算出链接代码与实际执行代码的偏移这样当用到rdata段数据的时候,用标号的地址加上这个偏移就可以得到在spi-flash的数据

而bal之后的ra寄存器保存的是当前存储介质的绝对地址。

发布了14 篇原创文章 · 获赞 7 · 访问量 13万+

4 syscall #打印字符串时将要输出的字符串的地址存到$a0,将$v0设置成4

发布了0 篇原创文章 · 获赞 7 · 访问量 1万+

  MIPS架构的寻址模式有寄存器寻址、立即数寻址、寄存器相对寻址和PC相对寻址4种其中寄存器相对寻址、PC相对寻址介绍如下:

1.1、寄存器相对寻址

  这种寻址模式主要被加载/存储指令使用,其对一个16位的立即数进行符号扩展然后与指定通用寄存器的值相加,从而得到有效地址

  这种寻址模式主要被轉移指令使用。在转移指令中有一个16位的立即数将其左移2位并进行符号扩展,然后与程序计数器PC的值相加可得到有效地址。

  • MIPS固定4字节指令长度
  • 内存中的数据访问(load/store)必须严格对齐(至少4字节对齐)。
  • 跳转指令只有26位目标地址加上2位对齐位,可寻址28位寻址空间即256MB。
  • 条件分支指令只有16位跳转地址加上2位对齐位,共18位寻址空间即256KB。
  • MIPS默认不把子函数的返回地址(就是调用函数的受害指令地址)存放到栈Φ而是存放到$31($ra)寄存器中,这对那些叶子函数(在函数中不再调用其他函数的函数)有利如果遇到嵌套函数,有其他机制处理
  • 流水線效应。MIPS采用了高度的流水线其中一个最重要的效应就是分支延迟效应。在分支跳转语句后面的那条语句叫做分支延迟槽实际上,在程序执行到分支语句时当它刚把要跳转到的地址填充好(填充到代码计数器里),还没有完成本条指令时分支语句后面的那个指令就巳经执行了,其原因就是流水线效应 ---- 几条指令同时执行只是处于不同的阶段。

  在执行第2行跳转分支时第3行的move指令已经执行完了。洇此在上面指令序列中,strrchr函数的参数来自第3行的$s0,而不是第1行的$s2

  从流水线效应中可以看出,是否正确理解MIPS指令的这些特点会直接影響我们对MIPS程序逆向分析的结果因此,我们需要熟悉把握这些特点

  所有MIPS指令的长度相同,都是32位为了让指令的格式刚好合适,设計者做了折中:将所有指令定长但是不同的指令有不同的格式。在MIPS架构中指令的最高6位均为Opcode码,剩下的26位可以将指令分为3种类型分別为R型、I型和J型。

  • R型指令用连续3个5位二进制码表示3个寄存器的地址然后用1个5位二进制码表示移位的位数(如果未使用移位操作,则全为0)最后是6位的Function码(它与Opcode码共同决定R型指令的具体操作方式)。
  • I型指令则用连续2个5位二进制码表示2个寄存器的地址然后是由1个16位二进制碼表示1个立即数二进制码。
  • J型指令用26位二进制码表示跳转目标的指令地址(实际的指令地址应为32位其中最低2位为“00”,最高4位由PC当前地址决定)
  • Opcode: 指令基本操作,称为操作码
  • Rs: 第一个源操作数寄存器。
  • Rt: 第二个源操作数寄存器
  • Rd: 存放操作结果的目的操作数。
  • Funct: 函数这个字段選择Opcode操作某个特定变体。

  注意:$Rd表示目的寄存器 $Rs表示源寄存器,$Rt表示作为中间缓存的寄存器"imm"表示立即数,“MEM[]“表示RAM中的一段内存“offset"表示偏移量。

  以"l"开头的都是加载指令以"s"开头的都是存储指令,这些指令用于从存储器中读取数据或者将数据保存在存储器中。

3.1.3、LW(Load Word) 指令用于从一个指定的地址加载一个word类型的值到一个寄存器中

3.1.5、MOVE指令用于寄存器之间值的传递。

  MIPS汇编指令的算术运算特点如下:

  • 算术运算指令的所有操作数都是寄存器不能直接使用RAM地址或间接寻址。

我要回帖

更多关于 la la li li 的文章

 

随机推荐