第二章:指令集 课程笔记

2020-9-25

1.浮点数转换

例子:20 的转换

  1. 十进制转换二进制。$$20_(10)=10100_(2)$$
  2. 归一化,化为小数点在第一位数后的形式。$$10100_(2)=1.0100*2^4$$
  3. 计算阶数,取出上式 2 的次方数4加上127。$$127+4 = 131_(10)$$把 131 转换为二进制数。$$131_(10) = 10000011_(2)$$
  4. 补上符号位,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 协议 ,转载请注明出处!