第二章:指令集 课程笔记
2020-9-25
1.浮点数转换
例子:20 的转换
- 十进制转换二进制。$$20_(10)=10100_(2)$$
- 归一化,化为小数点在第一位数后的形式。$$10100_(2)=1.0100*2^4$$
- 计算阶数,取出上式 2 的次方数4加上127。$$127+4 = 131_(10)$$把 131 转换为二进制数。$$131_(10) = 10000011_(2)$$
- 补上符号位,20 是正数符号位为 0。
$$0 10000011 0100…0$$2.指令集入门
两种架构:哈佛架构,冯诺依曼架构(平常是用的电脑)。
指令组成:寄存器,内存,操作符,常量
add $t0 $t1 1
符号 |含义
:—-:|:—-:
addi | 操作符
$t0 | 寄存器
$t1 | 寄存器
1 | 常量
常用寄存器映射
寄存器 | 映射 | 含义
:—-:|:—-:|:—-:
$0 | 无 | 常量0
$16 ~ $23 | $s0 $s7 |用于存储变量
$8 ~ $15 | $t0 $t7 |用于存储临时数据
2020-10-06
或与操作
或与作用:置0与取1
比如:
取出低两位并且对其他位置0
0101 and 0011 = 0001
取出低两位并且对其他位置1
0101 or 1100 = 1101
课堂题目:寄存器$t1第七位置1,第六位清零,保存在$t2
ori $t2 $t1 0x00000080
andi $t2 $t2 0xFFFFFFDF
2020-10-9
练习1.装载一个32bit立即数A
因为指令为定长32位,留给立即数的宽度只有16位。要加载32位立即数
(HA为立即数A的高16位,LA为立即数A的高16位)
lui $t0 HA
ori $t0 $t0 LA
练习2.判断奇偶性
假设数字存在$t0
andi $t1 $t0 0x1 # 将t0与上000...001(0x1),取出数字的最低位装入$t1。
beq $t1 $zero C0 # 若最低位为0说明是偶数
j C1
C0:
# 是偶数
j exit
C1:
# 是奇数
j exit
exit:
xxxx
练习3.计算斐波那契数列
(输入参数为n存在$a0)
fib:
addi $sp $sp -12 # 创建栈空间
sw $a0 0($sp) # a0存入栈空间
sw $s0 4($sp) # s0存入栈
sw $ra 8($sp) # ra存入栈
slt $t0 $a0 $zero # t0=(a0==0) tips: n是否等于0
beq $t0 $zero test2 # if(t0==true) jump->test2 (test2处理n==1的情况以及n>1的情况)
add $v0 $zero $zero # v0是返回值。相当于return 0
j rtn
test2:
addi $t0 $zero 1 # t0=1
bne $to $a0 gen # if(n!=1) jump->gen
add $v0 $zero $t0 # v0是返回值。相当于return t0
j rtn
gen:
subi $a0 $a0 1 # a0-- (此时a0是n-1)
jal fib # 调用fib(n-1),返回值在$v0
add $s0 $v0 $zero # s0=v0+0 也就是保存fib(n-1)的返回值
sub a0 a0 1 # a0-- (此时a0是n-2)
jal fib # 调用fib(n-2),返回值在$v0
add v0 v0 s0 # v0=v0+s0 也就是v0=fib(n-2)+fib(n-1)
j rtn
rtn:
xxx
练习4.双层循环
for(i=0;i<a;i++)
for(j=0;j<b;j++)
D[4*j]=i+j
坑点:4j一次会增加四个索引号,而int32本身是4个byte,所以需要移动16位
给定以下关系
a->s0
b->s1
i->t0
j->t1
D->s2
function as follow:
lw $s0 a # $s0=a
lw $s1 b # $s1=b
add $t0 $zero $zero # $t0=0 也就是i=0
loop1:
slt $t2 $s0 $t0 # 比较$s0(a) $t0(i)
bnq $t2 $zero exit1 # if(i>=a)
add $t1 $zero $zero
loop2:
slt $t2 $s1 $t1
bnq $t2 $zero exit2
add $t3 $t0 $t1 # temp0=i+j
sll $t4 $t1 4 # 关键位置 $t4=($t1)x16 就是temp1=j*4*4 左移4位(乘16)
add $t4 $t4 $s2 # 用上一句计算出的偏移量,对D进行偏移
sw $t3 0($t4) # D[4*j]=temp0
exit2:
addi $t1 $t1 1
j loop2
exit1:
addi $t0 $t0 1
j loop1
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!