ch2-1 指令-计算机的语言
MIPS汇编指令
- MIPS-32概述
- 三类汇编指令
- 过程支持
- c程序执行过程
- 五种寻址方式
- 字符支持 同步指令队ll-sc 排序程序 ARM与x86
指令的组成 MIPS的设计思想
计算机本质执行机器语言指令-01串
- 指明执行操作-操作码-01串前几位
- 数据来源、去向-操作数/地址码-01串剩余位
| 操作码 | 地址码 | 地址码 |
MIPS作为RISC指令集,力求简单,所用均为MIPS-32(32位长)
MIPS-32中的通用寄存器
MIPS运算操作数必须来自寄存器-register或者位于cpu中比cache小的存储器-层式存储结构的塔尖部分
专用寄存器如程序计数器pc
相对的为通用寄存器-暂时存放运算数据
MIPS由32个32位寄存器,共128B
有如下约定:
- 程序中变量存放在保存寄存器-store reg中: s 0 − s0- s0−s7共8个
- 运算中临时变量、中间变量放在临时寄存器-temp reg中: s 0 − s0- s0−s9共10个
- 特殊的零寄存器,永远放32位0:$zero
三类汇编指令
运算指令
- 算数运算
加减 add sub
加立即数 addi - 逻辑运算
与或非 and or nor
逻辑移位 sll srl
数据传送(MEM<->REG)
- 取字 lw
- 存字 sw
- 伪指令 move和li(addi)
- 装载32位立即数 lui+ori
决策指令
-
小于则置位 slt
-
条件分支 beq bne
-
分支伪指令 blt bgt ble bge
-
无条件跳转 j
三种指令格式
R型 add,sub,sll
I型 addi,lw,sw
J型 j
算术运算
c=a+b
add c,a,b
将a和b中的数据相加,并将结果存放在c中
减法ab有序
通式:add/sub des,src1,src2
i++/i=i+1
加法指令的src2改为常数1
没有subi 即立即数可以为附属
逻辑按位、移位运算
同时为1 与and结果为1
至少一个为1 或or结果为1
任何数据 非nor结果01取反
shift left logic
sll
s
0
,
s0,
s0,s1,2 里面的2是位移量要与addi的立即数区分开
综合练习1:变量的运算与赋值
注意里面的*5用4+1简化,没有subi,临时变量用$t0
寄存器-存储器数据传送指令
运算指令的操作数来自寄存器或这令本身
通用寄存器一共只有128B
数组元素占据成千上万个字节,只能存放在内存中
数组的第一个元素a[0]的32位地址称为数组的基址
如果源操作数在内存中,a[5]的地址表示为20($s1),机器会自动算好基址和偏移量,找到a[5]的地址
MIPS的通用寄存器都是32位长
这个长度就是MIPS体系结构的字长,通常代表了参与运算的数据长度
因此约定,1字=32b=4B
a[5]相对于a[0],在内存中距离是5个字而不是5个字节,而内存按照字节编址,所以偏移量应该是20字节
寄存器间的数据传送 装载立即数到寄存器
MIPS没有专门的寄存器间的移动数据的指令,可以通过把源寄存器的数据加上0再保存到目标寄存器中
addi
s
1
,
s1,
s1,t0,0
add
s
1
,
s1,
s1,t0,$zer0
用伪指令move
s
1
,
s1,
s1,s0
把常数10装入寄存器$s2
addi
s
2
,
s2,
s2,zero,10
伪指令li $s2,10
装载32位立即数到寄存器
立即数只能占用32位的16位
我们必须先用取高位立即数lui,放在高16位,之后再用ori与低16位立即数7FFF进行或运算
不能使用addi代替ori指令,如果低16位的最高位是1,addi就会理解为负数
综合练习2
数据大于32767,无脑使用装在32位立即数到寄存器
地址的字节表示不可以表示4i(
s
0
)
,
需要单独列出
4
i
数字,根据题意
i
就是
s0),需要单独列出4i数字,根据题意i就是
s0),需要单独列出4i数字,根据题意i就是s1所存的数
就酱,感谢你的阅读