当前位置:   article > 正文

MIPS汇编指令易错点碎碎念_mips指令集中的立即数

mips指令集中的立即数

数据溢出问题

根据MIPS指令集,我们知道,指令对于立即数都是有位数限制的。

下面将会给出几条带有立即数的指令,请问哪条指令的立即数存在数据溢出的情况?

PS:不同于机器码,汇编指令的参数需要以负号来区分正负数。


A addi $a0,$0,0x7643
B addi $a0,$0,0x8165 正确
C ori $a0,$0,0x7643
D ori $a0,$0,0x8165
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

对于addi和ori指令,他们的立即数都是16位的,不同之处在于addi中的立即数是有符号数,而ori中的立即数是无符号数。对于有符号立即数,第一位是符号位,也就是说addi指令的立即数最多只能表示一个15位的数,而0x8165是16位的数,所以数据溢出了。

指令跳转

1、j指令只有26位用于存储跳转到的地址,那么j指令能跳转到的代码范围有多大?
A 64KB
B 64MB
C 256MB 正确
D 4GB

2、jr指令可以跳转到的代码范围有多大?
A 64KB
B 64MB
C 256MB
D 4GB 正确

3、Beq指令可以跳转的代码范围有多大?
A 64KB
B 128KB
C 256KB 正确
D 512KB 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

根据指令集对j型指令的定义,其能跳转到的指令范围为226条,即228B。在高级语言转化为汇编语言的过程中,b类跳转指令通常对应于循环,因而一般是小范围的跳转;而j类跳转指令通常用于过程调用,可能会在整个程序的代码段范围内跳转。如果跳转范围超过256MB,则需要多条j指令进行“接力”或使用jr。jr是跳转到寄存器里存的值,所以可以达到232B。而对B类的指令,跳转有16位立即数,216条,即218B.(一条指令占4个字节所以要条数✖4变为B数

伪指令

.ascii 和 .asciiz 的区别
.ascii 声明使用 ASCII 字符声明一个文本字符串。字符串元素被预定义并且存放在内存中,其起始内存位置有便签 output指示。

.ascii和.asciz的区别是,.asciz会在字符串后自动添加结束符\0.
.ascii “string” …

在对象文件中按照指定的方法插入数字字符串,该字符串末尾没有NUL字符。该命令一次可以插入多个字符串,字符串之间用","分隔。下面的例子在对象文件中插入3个字节长的字符串。

.ascii "JNZ"      ; 插入3个字节: 0x4A 0x4E 0x5A
  • 1
  • 2
  • 3

.asciz “string” …

和.ascii相似,只是生成的字符串以NUL(0x00)结尾。下面的例子在对象文件中插入4个字节长的字符串。

.ascii "JNZ"      ; 插入4个字节: 0x4A 0x4E 0x5A 0x00
  • 1
  • 2
  • 3

扩展指令 列举

  • bgt $t0, $s0, loop_end 这里用了一个扩展指令bgt,当$t0>$s0的时候跳转到loop_end
  • move $s0, $v0 赋值,$s0=$v0
  • li $a0, 100 将100赋给$a0寄存器
  • la $t0, fibs 这条指令就是把fibs这个标签的地址存入$t0中(la指令,这条指令与li指令非常类似,都是为寄存器赋值,只不过是使用标签来为寄存器赋值。标签本质上对应一个32位地址,但li指令并不能直接使用标签来为寄存器赋值,必须要使用la。)

sll和sllv指令的区别

sll $t1, $t2, 10
sllv $t1, $t2, $t3
区别显然,前者时左移立即数各位数,后者是左移$t3寄存器中低5位对应的值(按无符号计算)

ori基本指令立即数大小范围

假如我们的CPU只支持 ori 指令,我们先会使用Mars编写测试程序,并将其导出到CPU上运行。下面会给出在Mars上编写的测试指令,试问,哪条指令能够在CPU上正确的运行呢?
A. ori $a0,$0,-1
B. ori $a0,$0,60000 √
C. ori $a0,$0,70000
D. or $a0,$0,$0

通过指令集对ori指令的解释我们知道,ori指令第三个立即数参数是16位,使用的是无符号扩展。因此ori指令的立即数参数不存在负数的情况,立即数的范围是 0x0000~0xffff 即 0~65535不过上面这些指令在Mars中都可以编译通过,这些不符号标准指令要求的指令会被当作扩展指令来处理,最终会通过一些标准指令的组合来实现相同的功能。

使用字符数组的易错点

MIPS中创建并使用字符数组,要注意,每个字符占1个字节并且不是字对齐的,所以:1.在通过字符数组下标index取其地址时,不用乘以4。2.在执行存取字符数组值指令的时候要用lbsb

函数调用的栈空间

调用函数开始要开辟栈空间,也要记得结束时回收栈空间,且二者大小相同。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号