mips

技术文章 1年前 (2020) 完美者
1,605 0

标签:ace   eth   后缀   ssi   cond   move   int   ini   统一   

xctf中进阶第三题,遇到了mips架构的题目。无法进行反编译。学了点misp的指令去看汇编

程序结构

数据声明+普通文本+程序编码(文件后缀为.s,或者.asm也行),数据声明在代码段之后

数据声明

以.data开始声明,声明后即在主存中分配空间。

声明格式: name:      type     value(s)

      变量名     类型     变量值

example

var1:         .word        3           # create a single integer variable with initial value 3
                   # 声明一个 word 类型的变量 var1, 同时给其赋值为 3
array1:   .byte   ‘a‘,‘b‘   # create a 2-element character array with elements initialized
                    # to a and b
                   # 声明一个存储2个字符的数组 array1,并赋值 ‘a‘, ‘b‘
array2:    .space   40   # allocate 40 consecutive bytes, with storage uninitialized
            # could be used as a 40-element character array, or a
            # 10-element integer array; a comment should indicate which!
                   # 为变量 array2 分配 40字节(bytes)未使用的连续空间,当然,对于这个变量
                   # 到底要存放什么类型的值, 最好事先声明注释下!

代码

代码段以.text开始为标志,就是各项指令操作,入口也是常见的main

访问内存只能用load或者store指令

读取写入指令集

load

lw   register_destination, RAM_source

从内存中 复制 RAM_source 的内容到 对应的寄存器中

(lw中的‘w‘意为‘word‘,即该数据大小为4个字节)

lb   register_destination, RAM_source
将RAM_source的字节复制到目标寄存器的低位字节

同上, lb 意为 load byte

store word:

sw register_source, RAM_destination

将 指定寄存器中的数据写入 RAM_destination

sb register_source, RAM_destination

将 指定寄存器中的数据(低位)写入 RAM_destination

load immediate

li   register_destination, value

将value写入目标寄存器     li 即为load immediate

example:
  .data
var1: .word 23 # declare storage for var1; initial value is 23
                   # 先声明一个 word 型的变量 var1 = 3;
  .text
__start:
  lw $t0, var1 # load contents of RAM location into register $t0: $t0 = var1
                   # 令寄存器 $t0 = var1 = 3;
  li $t1, 5 # $t1 = 5 ("load immediate")
                   # 令寄存器 $t1 = 5;
  sw $t1, var1 # store contents of register $t1 into RAM: var1 = $t1
                   # 将var1的值修改为$t1中的值: var1 = $t1 = 5;
  done

直接或间接寻址

load address:

直接给地址

    la   $t0,  var1

  复制var1的内存地址给寄存器$t0

indirect addressing:

地址是寄存器的内容

    lw  $t2,($t0)     

    将[$t0]地址中的数据写入到$t2中。   

    注意($t0)可以理解为汇编中[ax],也就是($t0)代表一个地址。数值为寄存器中的数

    sw   $t2,  ($t0)

    将寄存器$t2中的字写入[$t0]地址中。 同上

based or indexed addressing:

偏移量

    lw  $t2,  4($t0)

    将地址($t0+4)中的数据写入$t2。注意4($t0)可以理解为汇编中4[bx]

    sw   $t2,   -12($t0)

    将寄存器$t2的字写入($t0+4)地址中。同上

example:

      .data
array1:    .space   12    # declare 12 bytes of storage to hold array of 3 integers
                        # 定义一个 12字节 长度的数组 array1, 容纳 3个整型
      .text
__start:   la   $t0,   array1   # load base address of array into register $t0
                        # 让 $t0 = 数组首地址
      li   $t1,   5    # $t1 = 5 ("load immediate")
      sw   $t1,   ($t0)   # first array element set to 5; indirect addressing
                        # 对于 数组第一个元素赋值 array[0] = $1 = 5
      li   $t1,   13    # $t1 = 13
      sw   $t1,   4($t0)   # second array element set to 13
                        # 对于 数组第二个元素赋值 array[1] = $1 = 13
                        # (该数组中每个元素地址相距长度就是自身数据类型长度,即4字节, 所以对于array+4就是array[1])
      li   $t1,   -7    # $t1 = -7
      sw   $t1,   8($t0)    # third array element set to -7
                        # 同上, array+8 = (address[array[0])+4)+ 4 = address(array[1]) + 4 =   address(array[2])
      done

算术指令集

最多3个操作数
在这里,操作数只能是寄存器,绝对不允许出现地址
所有指令统一是32位 = 4 * 8 bit = 4bytes = 1 word
    add   $t0,$t1,$t2   # $t0 = $t1 + $t2; add as signed (2‘s complement) integers  作为有符号数相加

    sub   $t2,$t3,$t4   # $t2 = $t3 Ð $t4
    addi   $t2,$t3, 5   # $t2 = $t3 + 5; "add immediate" (no sub immediate)  与立即数相加
    addu   $t1,$t6,$t7   # $t1 = $t6 + $t7; add as unsigned integers    作为无符号整数相加
    subu   $t1,$t6,$t7   # $t1 = $t6 + $t7; subtract as unsigned integers    无符号数相减

    mult   $t3,$t4   # multiply 32-bit quantities in $t3 and $t4, and store 64-bit
               # result in special registers Lo and Hi: (Hi,Lo) = $t3 * $t4
                         运算结果存储在hi,lo(hi高位数据, lo地位数据)
    div   $t5,$t6        # Lo = $t5 / $t6 (integer quotient)
                # Hi = $t5 mod $t6 (remainder)
                         商数存放在 lo, 余数存放在 hi
    mfhi   $t0      # move quantity in special register Hi to $t0: $t0 = Hi
                   不能直接获取 hi 或 lo中的值, 需要mfhi, mflo指令传值给寄存器
    mflo   $t1       # move quantity in special register Lo to $t1: $t1 = Lo
              # used to get at result of product or quotient

    move   $t2,$t3         # $t2 = $t3

 

mips

标签:ace   eth   后缀   ssi   cond   move   int   ini   统一   

原文地址:https://www.cnblogs.com/0ice/p/13617819.html

版权声明:完美者 发表于 2020-09-17 14:07:07。
转载请注明:mips | 完美导航

暂无评论

暂无评论...