汇编和中断

Posted littlepage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编和中断相关的知识,希望对你有一定的参考价值。

MISP汇编

0.常见操作符

  • add $r10, $r1, $r2 表示r10 = r1+r2
  • addi $r1, $zero, 1000表示0寄存器和立即数1000相加放入r1
  • lw $r0, 8($sp) 表示load word sp地址+8 到r0
  • beq $r3, $r9, LABEL 表示branch equal如果相等,则跳转LABEL
  • load从内存加载寄存器
  • store存储回去
  • 加减乘除addisubidivimulti
  • slt表示set if less than如果小于执行
    • slt $d, $rs, $rt
    • slit $d, $rs, 5
  • j LABEL LABEL寻址
  • jr $a0 寄存器寻址
  • jal LABEL多合一跳转
    • 当前PC + 4存入 $ra寄存器
    • j LABEL返回

举例

1.判断求和

if(i == j) {
    f = i + j
} else {
    f = i - j
}

汇编

bne $r3, $r4, ELSE # bne——branch not equal
add $r5, $r3, $r4
j EXIT # j——jump
ELSE:
sub $r5, $r3, $r4
EXIT

2.for loop

sum = 0
for(i = 0; i < 100; i++) {
    sum += i
}

汇编

addi $s3, $zero, 0 # sum = 0
addi $s4, $zero, 0 # i = 0
addi $s5, $zero, 100 # 100
LOOP:
beq $s4, $5, EXIT
add $s3, $s4, $s3
addi $s4, $s4, 1
j LOOP # -16
EXIT:

3.函数

  • 函数体——Label标签
  • jal——跳转并链接(jump and link)
  • 传参——栈
# fac(5)
addiu $s0, $0, 5 # 函数参数5存入栈 add immidiate unsigned
sw $s0, $sp # s0写入sp
addi $sp, $sp, -4 # 栈指针指向下一个
jal FACT # 跳转
# 函数体
lw $s0, 4($sp) # 读取参数

4.函数返回

# 函数体最前面
sw $ra, 0$(sp)
addiu $sp, $sp, -4
lw $t1, 4($sp)
lw $s0, 8($sp)
jr $t1 # 跳转回去

中断

当外界发生变化,通过中断CPU注意某个时间的发生。这个时候,CPU执行的状态被保存,中断响应程序被执行

技术图片

  • OS加载时候加载IVT(比如类型01的程序,中断响应程序存在0x003上)
  • 硬件中断——鼠标、键盘响应操作
  • 软件中断——高级语言异常处理

技术图片

Q&A

  • 32位机器的中断路径(ISR)只有4个字节,如何执行程序?
    • 操作系统进行中断操作,然后执行程序
  • 按键中断响应路径到操作系统再到应用,系统如何知道?
    • 每个键盘操作都是一个地址映射
  • 出错了?为什么不直接跳转错误处理?
    • 不是1对1的关系,要降低耦合程度

以上是关于汇编和中断的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

汇编:实验12:自定义零号中断处理程序

汇编:实验12:自定义零号中断处理程序

汇编的中断指令INT21H有啥用啊?

汇编三种方法实现装填中断子程序地址的代码

汇编|使用10h中断来显示字符串