跳至主要内容

32位ARM汇编语言(二)ARM 汇编语言特点

http://ift.tt/2FpIH4w


两种不同风格的ARM指令

ARM 官方的ARM汇编指令:指令一般用大写,Windows中IDE开发环境常用,如LDR RO,[R1]

GNU风格的ARM汇编:指令一般用小写字母,linux中常用,如:ldr r0,[r1]

特点1:LDR/STR结构

  • ARM 采用RISC(Reduced Instruction Set Computer 中文:精简指令计算机)结构,cpu本身不能直接读取内存,需要先将内存中的内容加载到cpu中的通用寄存器中,而后才能被cpu处理
  • ldr(load register)指令将内存内容加载入通用寄存器
  • str(store register)指令将寄存器内容存入内存空间中
  • ldr/str组合用来实现ARM cpu和内存的数据交互

特点2:8中寻址方式

寻址方式 示例
寄存器寻址 mov r1,r2
立即寻址 mov r0,#0xff00
寄存器移位寻址 mov r0,r1,lsl#3
寄存器间接寻址 ldr r1,[r2]
基址变址寻址 ldr r1,[r2,#4]
多寄存器寻址 ldmia r1!,{r2-r7,r12}
堆栈寻址 stmfd sp!,{r2-r7,lr}
相对寻址 beq sign

特点3:指令后缀

虽然ARM的汇编指令不是很多,但是通常可以在指令后面跟上后缀,变成不同的指令,常用的指令有:

常用指令后缀 解释
B(byte) 功能不变,操作长度变为8位
H(half word) 功能不变,长度变为16位
S(signed) 功能不变,操作数变为有符号(如ldrsh,ldrsb)
S(S标志) 功能不练,影响CPSR标志位,如(mov 和movs,movs r0,#0)

特点4:条件执行后缀

条件码 助记符 助记符全拼 说明 检测条件
0000 EQ equal 等于0 Z=1
0001 NE not equal 不等于0 Z=0
0010 CS/HS carry / higher or same 进位/无符号数大于等于 C=1
0011 CC/LO /lower(unsigned<) 为进位/无符号数小于 C=0
0100 MI 负数 N=1
0101 PL 正数或零 N=0
0110 VS 溢出 V=1
0111 VC 未溢出 V=0
1000 HI 无符号大于 C=1&Z=0
1001 LS 无符号数小于或等于 C=0&Z=1
1010 GE greater or equal 有符号数大于或等于 N=V
1011 LT 有符号数小于 N!=V
1100 GT greater than 有符号数大于 Z=0&N=V
1101 LE lower or equal 有符号数小于或等于 Z=1&N!=V
1110 AL always 总执行 任何状态
1111 NV 从不(不能使用)

特点5:多级指令流水线

为增加处理器指令流的速度,ARM使用多级流水线

注意:当使用多级流水线的时候,PC指向的是正在被取的指令,而非正在执行的指令

也就是说,如果看到PC在0x1008这个地址上,那说明pc正在读0x1008处的指令,在ARM模式下0x1004 (Thumb模式下0x1006)为译码处,而在0x1000(Thumb:0x1004)才是正在执行的代码地址

The post 32位ARM汇编语言(二)ARM 汇编语言特点 appeared first on cole.

http://ift.tt/2DLuJty ArmAsm, ARM, asm, Assembly January 29, 2018 at 08:30PM

评论

此博客中的热门博文

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