汇编语言知识要点
这里写目录标题
mips架构下的寄存器
系统调用-syscall
整数的输入输出
read
li $ v0, 5
syscall
输入的数存到$v0中
li $ v0, 1
syscall
此时输出的为==$ a0==(过程调用参数寄存器中的值)
常用指令——按功能分类
寄存器传送
move(MOVE):用作寄存器间值的传送
格式:move $t1, $t2
加载和存储
加载
加载立即数
li(Load immediate):$t1 = immediate(符号扩展)
格式:li $t1, -100
immediate 可以替换为零扩展 即100
immediate 可以替换为32bits 即100000
加载地址
la(Load Address):加载变量的地址 set $t1 to contents of $t2
格式:la $t1, $t2
从内存中加载字
lw(Load Word):加载字,把内存中地址为array+$ t1的数取出到$ a0中
格式:lw $t1 ,-100( $t2 )
地址必须为4的倍数例lw $ a0,array($ t1)
存储
向内存中存储字
sw(Store Word):存储字
格式:sw $t1, -100( $t2)例 sw $v0, array( $t1)
地址必须为4的倍数把输入的数存入地址为array+$t1的内存中
逻辑操作指令
主要用于条件判断时使用
and:与
格式:and $t1, $t2, $t3
andi:与立即数
格式:and $t1, $t2, 100
or: 或
格式:or $t1, $t2, $t3
ori: 或立即数
格式:ori $t1, $t2, 100
xor: 异或
格式:xor $t1, $t2, $t3
nor: 或非
格式:nor $t1, $t2, $t3
条件设置指令
基础指令
slt(set less than): 如果$t2<t3,set $t1 = 1, 否则 set $t1 = 0
格式:slt $t1, $t2, $t3slti(set less than immediate): 如果$t2<16bits immediate ,set $t1 = 1, 否则 set $t1 = 0
格式:slt $t1, $t2, -100
扩展指令
seq(set Qqual): 如果$t2= = t3,set $t1 = 1, 否则 set $t1 = 0
格式:seq $t1, $t2, $t3seq(set Qqual): 如果$t2= =immediate,set $t1 = 1, 否则 set $t1 = 0
格式:seq $t1, $t2, 100huozhe-100
sge(set greater or equal ): 如果 $t2 >= $t3 immediate ,set $t1 = 1, 否则 set $t1 = 0
格式:slt $t1, $t2, $t3
$t3也可以是立即数
还有sgt, sgtu, sltiu, sle, sleu, sne等
整数乘法除法和求余
div:除法,$t1 / $t2.然后将余数放到HI寄存器,商放到LO寄存器
格式:div $t1 $t2
传输指令
结合除法指令使用,获得商和余数
读取HI寄存器
mfhi(move from hi):把HI寄存器中的值存储到$t1中
格式:mfhi t 1 读 取 L O 寄 存 器 ∗ ∗ m f l o ( m o v e f r o m l o ) ∗ ∗ 把 L O 寄 存 器 中 的 值 存 储 到 t1 读取LO寄存器 **mflo( move from lo )**把LO寄存器中的值存储到 t1读取LO寄存器∗∗mflo(movefromlo)∗∗把LO寄存器中的值存储到t1中
格式:mflo $t1
写HI寄存器
mthi(move to hi):把 $ t1 寄存器中的值存储到HI中
格式:mthi t 1 写 L O 寄 存 器 ∗ ∗ m t l o ( m o v e t o l o ) ∗ ∗ 把 t1 写LO寄存器 **mtlo( move to lo )**把 t1写LO寄存器∗∗mtlo(movetolo)∗∗把t1中的值存储到LO寄存器中
格式:mtlo $t1
bnez:不等于0转移if($t1 != 0)跳转
格式:bnez $t1 ,label
分支
等于转移
beq:等于转移if($t1 == $t2) 跳转
格式:beq $t1, $t2, label
$t2 也可以用
不等于转移
bne:不等于转移if($t1 != $t2) 跳转
格式:bne $t1, $t2, labelbnez:不等于0转移if($t1 != 0)跳转
格式:bnez $t1 ,label
小于
blt:if($t1 < $t2) 跳转
格式:blt $t1, $t2, labelbltz:if($t1<0)跳转
格式:bltz $t1, label
大于
bgt:if($t1 > $t2) 跳转
格式:bgt $t1, $t2, labelbgtz:if($t1>0)跳转
格式:bgtz $t1, label
小于等于
ble:if($t1 <= $t2) 跳转
格式:ble $t1, $t2, labelblez:if($t1<=0)跳转
格式:blez $t1, label
大于等于
bge:if($t1 >= $t2) 跳转
格式:bge $t1, $t2, labelbgez:if($t1>=0)跳转
格式:bgez $t1, label
跳转
跳转(无条件)
j(jump):跳转到指定地址
格式:j target
跳转并链接
jal(jump and link):跳转到指定地址的同时,还要保存返回地址到ra寄存器。
格式:jal target
还需补充
循环和判断
宏的使用
编程序实例