跳至主要内容

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; ...

RS232 学习笔记

https://ift.tt/2zh0MU7 什么是RS232 RS232的传输方式 RS232的分类 数据终端设备:DTE(Data Terminal Equipment) 数据通信设备:DCE:Data Communication Equipment 常见的管脚接口和脚位的意义 发展 RJ-45接口和DB-9 Console 及DB-9 Modem接口的对应关系 9针串口 各脚位的意义 常见的串口设置 波特率(Bps) 数据位(Data Bits) 奇偶校验(Parity) 停止位(Stop Bits) 流量控制 什么是RS232 RS232 是 美国电子工业联盟 指定的串行通信的接口标准。 原始编号全称是EIA-RS-232(简称232,RS232)。他被广泛用于计算机串行接口外设连接。 RS232 标准的全称是EIA-RS-232C标准,其中EIA代表美国电子工业联盟,RS(Rrcommand Standard)代表推荐标准,232是标识号,C代表232的第三次修改。 RS232的传输方式 在rs232标准中,字符是以一串行的比特串来一个接一个断点以串列(serial)的方式传输的(所以又叫串口)。 优点 传输线少,配线简单,发送距离可以较远 最常见的编码格式是异步起停( Asynchronous Start-stop )格式,它使用一个起始比特后面紧跟7个或8个数据比特(bit),然后是奇偶校验比特,最后是一个或两个停止比特。所以发送一个字符至少需要10比特,带来的效果是使全部的传输速率,发送信号的速率以10划分。 一个最平常的代替异步起停的方式是使用高级数据链路控制协议(HDLC)。 RS232在设计之初就是用来连接调制解调器做传输之用的,也因此它的脚位意义通常和调制解调器传输有关。 RS232的分类 根据不同的线路用来发送和接受信号的不同,妇女为 数据终端设备:DTE(Data Terminal Equipment) 计算和终端设备有DTE连接器 数据通信设备:DCE:Data Communication Equipment 调制解调器和打印机有DCE连接器 不是很准确, 但是可以大概分为这两类 常见的管脚接口和脚位的意义 发展 RS232...