转载arm汇编语言学习笔记

XREF

XREF的分类:

1.代码交叉引用,-CODE XREF
2.数据交叉引用,-data xref
XREF含义描述


image
  1. 这是个代码交叉引用
  2. fun是被引用者,main+2c表示引用者
  3. 下箭头表示引用者的地址比fun高,你需要向下滚动才能到达引用者地址(main+2C),上行反之
  4. 每个交叉引用注释都包含一个单字符后缀箭头后面),用以说明交叉引用的类型

CODE XREF

代码交叉引用用于表示一条指令将控制权转交给另一条指令。在IDA中,指令转交控制权的方式叫做流,有三种基本流:

普通流
调用流
跳转流

在函数位置处,按x可以查看其所有交叉引用的值,和相应的情况
调用流
由函数调用导致的交叉引用使用后缀 ↓p(看做是procedure)

跳转流
跳转交叉引用使用后缀↑j(看做jump)

DATA XREF

数据交叉引用用于跟踪二进制文件访问数据的方式。数据交叉引用与IDA数据库中任何牵涉到虚拟地址的字节有关

最常用的三种数据交叉引用:
addr何时被读取(读取交叉引用)
addr何时被写入(写入交叉引用)
addr何时被引用(偏移量交叉引用)

读取交叉引用表示访问的是某个内存位置的内容
使用后缀 ↑r(看做是Read)
写入交叉引用指出了修改变量内容的程序位置
使用后缀 ↑w(看做write)
偏移量交叉引用表示引用的是某个位置的地址
使用后缀↑o(看做offset)

出处arm汇编语言学习笔记

1、arm伪指令在汇编时,会被合适的机器指令代替,实现真正的机器指令操作!

2、DCB、DCW、DCD、DCQ,这4条伪指令都是用于分配一段内存单元,并对该内存单元初始化。唯一的区别是它们分配内存单元的大小不同

DCB分配一段字节的内存单元,其后的每个操作数都占有一个字节,操作数可以为-128~255的数值或字符串

DCW分配一段半字的内存单元,其后的每个操作数都占有两个字节,操作数是16位二进制数,取值范围为-32768~65535

DCD分配一段字的内存单元,其后的每个操作数都占有4个字节,操作数可以是32位的数字表达式,也可以是程序中的标号(因为程序中的标号代表地址,也是32位二进制数值)

DCQ分配一段双字的内存单元,其后的每个操作数都占有8个字节

3、宏是一段功能完整的程序,能够实现一个特定的功能,在使用中可以把它视为一个子程序。
宏应用举例:

MACRO ; 宏 定 义 开 头
MAX date,time ; 宏 名 为 MAX, 带 两 个 参 数 date和 time
LDR R1, = 0x1000 ; R1 = 0x1000( 存 储 单 元 的 首 地 址 )
**LDR R0, = date ; R0等 于 date参 数 值** STR R0, [R1], #04 ; R0 → [R1], 保 存 R0的 内 容 , 同 时 R1的 地 址 +4 LDR R2, =time
STR R2, [R1]
MEND ; 宏 定 义 结 束
...
MAX 0x858, 12 ; 调 用 宏
ADD R3, R0, R2

宏与子程序的区别,在于调用宏时编译程序会在调用处插入宏的程序段,有多少次调用就会插入多少宏的程序段;而调用子程序不增加新的程序段。

上例定义了MAX宏,宏语句段的功能是完成将两个参数date和time保存到起始地址为0x1000的内存单元中。

4、杂项伪指令

杂项伪指令介绍如下:
■ 导出伪指令:EXPORT、GLOBAL。
■ 导入伪指令:IMPORT、EXTERN。
■ 文件包含伪指令:GET、INCLUDE。
一个程序可以由多个汇编源文件组成,多个文件间会互相引用符号(变量或标号)。当在一个源文件中定义的一个符号希望其他文件引用时,则必须用导出伪指令定义这个符号;如果这个文件引用了外部定义的符号,则必须用导入伪指令定义这个符号。

5、顺序程序设计 举例

AREA Buf, DATA, READWRITE ;定 义 数 据 段 Buf
Array DCD 0x11, 0x22, 0x33, 0x44 ;定 义 12个 字 的 数 组 Array
DCD 0x55, 0x66, 0x77, 0x88
DCD 0x00, 0x00, 0x00, 0x00
AREA Example, CODE, READONLY
ENTRY
CODE32
LDR R0, = Array ;取 得 数 组 Array首 地 址
LDR R2, [R0] ;装 载 数 组 第 1项 字 数 据 给 R2
MOV R1, #4
LDR R3, [R0, R1, LSL #2] ;装 载 数 组 第 5项 字 数 据 给 R3
ADD R2, R2, R3 ; R2 + R3 → R2
MOV R1, #8 ; R1 = 8
STR R2, [R0, R1, LSL #2] ;保 存 结 果 到 数 组 第 9项
END

6、分支程序设计
C语言程序如下 :

int x=76; //定 义 整 型 变 量
int y=88;
if( x>y )
z=100;
else
z=50;

arm汇编如下:

...
MOV R0, #76 ; 初 始 化 R0的 值
MOV R1, #88 ; 初 始 化 R1的 值
CMP R0, R1 ; 判 断 R0>R1?
MOVHI R2, #100 ; R0>R1时 , 这 条 语 句 执 行 , 则 R2 = 100
MOVLS R2, #50 ; R0<R1时 , 这 条 语 句 执 行 , 则 R2 = 50
...

7、循环程序设计

编写循环语句实现数据块复制

LDR R0, =DATA_DST ; 指 向 数 据 目 标 地 址
LDR R1, =DATA_SRC ; 指 向 数 据 源 地 址
MOV R10, #20 ; 赋 值 数 据 个 数 20×N个 字
; N为 LDM指 令 操 作 数 据 个 数
LOOP LDMIA R1!, {R2-R9} ; 从 数 据 源 读 取 8个 字 到 R2~ R9
STMIA R0!, {R2-R9} ; 将 R2~ R9的 数 据 保 存 到 目 标 地 址
SUBS R10, R10, #1 ; R10-1, 并 改 变 程 序 状 态 寄 存 器
BNE LOOP

8、子程序设计

在一个程序的不同部分往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序形式,以便需要时可以调用它。
调用程序在调用子程序时,经常需要传送一些参数给子程序;子程序运行完后也经常要回送结果给调用程序。这种调用程序和子程序之间的信息传送称为参数传
送。参数传送可以有以下两种方法:
■ 当参数比较少时,可以通过寄存器传送参数。
■ 当参数比较多时,可以通过内存块或堆栈传送参数。

子程序的正确执行是由子程序的正确调用及正确返回保证的。这就要求调用程序在调入子程序时必须保存正确的返回地址,即当前PC值(由于ARM流水线特性,可能要减去一个偏移量)。PC值可以保存在专用的链接寄存器R14中,也可以保存到堆栈中。根据这两种情况,可以在子程序中采用如下的返回语句:

MOV PC, LR ; 恢 复 PC的 值
或 STMFD SP!, {R0-R7,PC} ; 将 PC值 从 堆 栈 中 返 回

使用堆栈来恢复处理器的状态时,注意STMFD与LDMFD要配合使用。一般来讲,在ARM汇编语言程序中,子程序的调用是通过BL指令来实现的。该指令在执行时完成如下操作:将子程序的返回地址存放在链接寄存器LR中(针对流水线特性,已经减去偏移量了),同时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时,只需要将存放在LR中的返回地址重新拷贝给程序计数器PC即可。

9、子程序程序设计举例

MAX函数和调用主程序

int MAX( int i, int j ) //声 明 子 函 数 MAX
{
if( i>j ) return ( i );
else return ( j );
}

Main(void) //主 函 数
{
int a, b, c;
a=19; //给 变 量 a赋 初 值
b=20; //给 变 量 b赋 初 值
c=MAX(a,b); //调 用 MAX子 函 数 , 把 最 大 值 赋 给 c
}

MAX汇编子程序和调用主程序
X EQU 19 ; 定 义 X的 值 为 19
N EQU 20 ; 定 义 N的 值 为 20
AREA Example4, CODE, READONLY ; 声 明 代 码 段 Example4
ENTRY ; 标 识 程 序 入 口
CODE32 ; 声 明 32位 ARM指 令
START LDR R0, =X ; 给 R0、 R1赋 初 值
LDR R1, =N
BL MAX ; 调 用 子 程 序 MAX, 返 回 值 为 R2
HALT B HALT ; 死 循 环
MAX ; 声 明 子 程 序 MAX
CMP R0, R1 ; 比 较 R0与 R1, R2等 于 最 大 值
MOVHI R2, R0
MOVLS R2, R1
MOV PC, LR ; 返 回 语 句
MAX_END
END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容