跳至主要内容

32位ARM汇编语言(四)数据处理指令

http://ift.tt/2Gwa4v5


基本指令介绍

  • 数据传送指令
    数据传送指令用于在寄存器和储存器中之间进行数据的双向传输
    
    比如:MOV ,MVN
    
    
  • 算数逻辑运算指令
    完成常用的算术与逻辑运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中相应条件表示位
    
    比如:ADD,ADC,SUB,SBC,RSB,RSC,AND,ORR,EOR,BIC
    
    
  • 比较指令
    不保存运算结果,只更新CPSR中相应的条件标志位
    
    比如:CMP,CMN,TST,TEQ
    
    

数据传送指令

指令 描述
MOV{条件}{S}目的寄存器,操作数 数据传送指令
MVN{条件}{S}目的寄存器,操作数 数据取反传送指令
    {S}选项决定指令的操作是否影响CPSR中条件标志位的值

MVN与MOV不同之处是在传送之前按位被取反

__asm__ ("mov ri,r0“);   //将寄存器R0的值传送到寄存器R1
__asm__(”mov r1,r0,lsl#3"); //将寄存器R0的值左移3位后传到R1
__asm__(“mov pc,lr");    //将寄存器lr的值传送到pc,常用于子程序返回

__asm__("mvn r0,#0”);   // 将立即数0 取反传送到寄存器R0中,完成后R0=-1


比较指令

指令 描述
CMP{条件}操作数1,操作数2 比较指令
CMN{条件}操作数1,操作数2 比较反值指令
TST{条件}操作数1,操作数2 位测试指令
TEQ{条件}操作数1,操作数2 相等测试指令

比较或者测试时,会影响CPSR寄存器中条件标志位的值

cmp{条件}操作数1,操作数2

cmp指令进行一次减法运算,但不储存结果,只更改条件标志位,

CMN{条件}操作数1,操作数2

CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位n

  • 指令示例
    | 指令 | 描述|
    | --- | --- |
    |CMN R1,R0|将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位|
    |CMN R1,#100|将寄存器R1的值与立即数100相加,并设置响应的CPSR|

TST{条件},操作数1,操作数2

TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值

  • 操作数1是是要操作的数据,操作数2是一个位掩码,该指令一般用来检测时候设置了特定的位
  • 指令示例
指令 描述
TST R1,#%1 用于测试R1中是否设置了最低位,%表示是二进制
TST R1,#0xffe 将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位

TEQ{条件} 操作数1,操作数2

TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值

  • 该指令通常用于比较操作数1和操作数2是否相等
  • 指令示例

指令 描述
TEQ R1,R2 将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

算数逻辑运算指令

指令 描述
ADD{条件}{S}目的寄存器,操作数1,操作数2 加法指令
ADC{条件}{S}目的寄存器,操作数1,操作数2 带进位加法指令
SUB{条件}{S}目的寄存器,操作数1,操作数2 减法指令
SBC{条件}{S}目的寄存器,操作数1,操作数2 带进位的减法指令
RSB{条件}{S}目的寄存器,操作数1,操作数2 逆向减法指令
RSC{条件}{S}目的寄存器,操作数1,操作数2 逆向带进位减法指令
AND{条件}{S}目的寄存器,操作数1,操作数2 逻辑与运算指令
ORR{条件}{S}目的寄存器,操作数1,操作数2 逻辑或运算指令
EOR{条件}{S}目的寄存器,操作数1,操作数2 逻辑异或运算指令
BIC{条件}{S}目的寄存器,操作数1,操作数2 清理标志位指令

ADD{条件}{S}目的寄存器,操作数1,操作数2

加法没什么可说的

ADC{条件}{S}目的寄存器,操作数1,操作数2

带进位的加法,也没什么可以说的,跟x86一样,不过这里加的是CPSR中C标志位的值,但是需要注意的是,需要设置S条件来更改CPSR的值,否则状态寄存器并不会改变

RSB{条件}{S}目的寄存器,操作数1,操作数2

reverse sub method
逆向减法,是把减法的操作顺序反过来,操作数2减操作数1,并将计算的结果保存到目的寄存器中

RSC{条件}{S}目的寄存器,操作数1,操作数2

带进位的逆向减法,除了逆向的部分跟上面一样外,还要减去CPSR中C标志位的反码,然后将结果保存到目的寄存器中

但是要操作数1寄存器,操作数2可以是寄存器,也可以是立即数,同样的不要忘记设置S来使CPSR进位

  • 指令示例
指令 描述
RSC R0,R1,R2 R0= R2-R1-!C

AND{条件}{S}目的寄存器,操作数1,操作数2

逻辑与运算,将操作数1与操作数2进行逻辑与运算,结果保存到目的寄存器

跟x86 的一样,没什么可说的

EOR{条件}{S}目的寄存器,操作数1,操作数2

逻辑异或运算,把结果放到目的寄存器汇中,并且操作数1必须是寄存器 ,操作数2可以是其他的,常用于反转数1的某些位

  • 指令示例
指令 描述
EOR R0,R0,#3 反转R0的0,1位,其他保持不变,将结果保存到R0中

BIC{条件}{S}目的寄存器,操作数1,操作数2

用于清楚操作数1的某些位,并吧结果保存到目的寄存器中。操作数1必须是一个寄存器。操作数2作为一个32位的掩码,如果再掩码中设置了哪一位,就清除这一位,没有设置就保持不变

  • 指令示例
指令 描述
BIC R0,R0,#%1011 该指令消除R0中的位0,1和3,其他位置保持不变

The post 32位ARM汇编语言(四)数据处理指令 appeared first on cole.

http://ift.tt/2DLuJty ArmAsm, ARM, asm, Assembly January 30, 2018 at 09:15AM

评论

此博客中的热门博文

反Hook 之自己实现GetProcAddress和LoadLibraryA(c++ version)

http://ift.tt/2AocAD0 // 课上练习.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> //要实现的功能: /* 自己实现GerProcAddress LoadLibraryA */ //思路: /* GerProcAddress和LoadLibraryA都是在Kernel32.dll中的 首要的任务就是找到Kernel32.dll,然后遍历IAT就能找到这两个函数 现在首要的难点就是如何找到kernel32.dll() 通过dll的加载顺序可以找到,而且虽然需要使用未文档化的API,但是好在windgb可以直接看,而且用到的也并不是很多 懒得去晚上搜了,直接自己实现一个得了,作为演示,能用就行(最好还是搜一个正规的结构体) */ /* 0: kd> dt _TEB /a nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB //首先实现部分TEB结构体,因为只需要用的PEB的部分,所以实现到这就ok了 */ //构建 TEB typedef struct _TEB { //保证0x30是peb的结构体就ok了 struct _tem { DWORD a1; DWORD a2; DWORD a3; DWORD a4; DWORD a5; DWORD a6; DWORD a7; DWORD a8; DWORD a9; DWORD a10; ...

IDA动态调试ELF中遇到的问题(1)

https://ift.tt/2Gxnf2F 遇到 got SIGCHLD singal(child status has changed)...这种提示 singal fork了子进程 直接点yes,然后继续单步执行,出来提示 pass to application就行了 内存查看 用od习惯了之后,凡事都想右键看一下内存,但是IDA中好像没有那么如意, 目前只是在栈中右键发现有查看hex的选项 动态调试的时候的nop ida保存动态调试的时候修改的数据 方法一:在程序运行的时候保存 The post IDA动态调试ELF中遇到的问题(1) appeared first on cole . https://ift.tt/2q9Qf5g WHATEVER April 05, 2018 at 09:44AM

数据库(MySQL)编程之数据库和表的基本操作

http://ift.tt/2gOXg6X     数据库和表的基本操作 操作前的基本知识 基本 sql语句不区分大小写(关键字建议用大小写),但字符串常量区分大小写 sql语句可单行或多行书写,以; 结尾 关键字不能跨行或简写 可以用空格或者缩进来提高可读性 注释 sql标准 /**/ : 多行注释 "--":单行注释 mysql 标准: "#":单行注释 "COMMENT":为字段或列添加注释 创建和查看数据库 创建数据库 模板 CREATE DATABASE [IF NOT EXISTS ] db_name create_specification: IF NOT EXITSTS : 检查数据库是否存在,如果存在就不创建 creat_specification :创建条件 CHARACTER SET: 制定数据聚采用的字符集 COLLATE :制定数据库字符集的比较方式 DEFAULT :表示默认内容,即使没有制定该项,也有默认的值 # 创建数据库使用字符集为 UTF-8 ,使用规则为 uftf_bin CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE uft8_bin; 一般默认的数据库就是utf8 和utf8_bin的比较方式,因此一般创建数据库的时候都用 CREATE DATABASE db_name mysql> create database testdb; Query OK, 1 row affected (0.02 sec) 查看数据库 命令 SHOW DATABASES     mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sakila | | sys | | testdb | |...