标签: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
标签:ace eth 后缀 ssi cond move int ini 统一
原文地址:https://www.cnblogs.com/0ice/p/13617819.html