找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3603|回复: 6

【ARM】有关ARM汇编的学习笔记

[复制链接]

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24235 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2017-12-18 09:10:41 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
ARM的寄存器:

r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15



看图。

r0到r3,还有r12是常用寄存器。其中r0到r3被用于函数传参,r12则是被拿来随便用,所以子过程不保证返回后它的值不变。
r0也被用于传函数返回值。

r4到r11是保留寄存器。用之前入栈,用完了出栈。

r13是栈顶,也写作sp。其实并不怎么在栈上用。
r14是链接寄存器,写作lr,它存储了程序返回的地址。
r15是指令计数器,写作pc,用于读指令。

ARM汇编与x86汇编之间做个对比:

  • 都有栈顶寄存器。
  • ARM多了个链接寄存器,用于返回。
    这一点和x86不同。x86用call来调用函数,这个过程会把返回地址压入栈,然后转到被调用的函数的入口。被调用的函数执行完了后,再用ret来返回。x86的ret从栈顶弹出返回地址到指令指针,从而返回到调用者。
    而ARM的调用则是使用bl或者blx指令,它把返回地址存到链接寄存器lr,然后修改指令计数器pc。此处有个疑问:如果被调用的函数也要调用函数的话,怎么办?答案是:把链接寄存器lr入栈。这样lr就可以被嵌套使用了。而且你还可以用pop指令把栈顶上的返回地址弹出到pc上来返回,或者“返返回”,回到调用者的调用者那里去。
    调用指令“bl”全名“branch with link”,“带链接的分支”。而不带链接的分支,则是“B”,跳转指令。也就是“branch”的缩写。
  • x86使用“指令指针寄存器”eip,去“代表”执行的指令的地址。而ARM则使用“指令计数器”pc。这个pc有个特性,在后面我会说一下。


ARM的PC寄存器并不指向当前执行的指令的地址,而是指向当前执行的指令的下下一条指令的地址。
为啥要这样设计呢?因为ARM它有个三级流水线。
  • 从[PC]处取出指令。
  • 把取出的指令进行译码,也就是判断它是一条干啥的指令。
  • 知道这条指令是干啥的了以后,再执行。

1334679369_7684.jpg
ARM它并不傻乎乎地取一条执行一条。它三件事是同时执行的。每个周期,它都从[PC]处取指,并且把上一个周期取到的指令进行译码,并且执行上上一个周期译码完成的指令。
(PS:我不是在说51单片机傻)
1334680233_9073.jpg
因为这个关系,ARM的PC总是指向当前执行的指令的下下一条。也就是它正在取指的地方。就是这个地方,ARM的pc和x86的eip不同。

当ARM执行了一条跳转指令后,它就得清空这个流水线,丢掉之前取到的指令,然后重新取新的。这会导致ARM处理器不得不先懵逼两个周期,然后在第三个周期才能开始执行。所以从优化上来说,要尽量减少跳转。

参考资料:
https://community.arm.com/proces ... -from-arm-assembler
http://m.blog.csdn.net/abclixu123/article/details/7471822

PS.感谢coldzenleft给我的帮助
回复

使用道具 举报

13

主题

49

回帖

513

积分

用户组: 大·技术宅

UID
2285
精华
0
威望
39 点
宅币
362 个
贡献
11 次
宅之契约
0 份
在线时间
36 小时
注册时间
2017-2-25
发表于 2017-12-18 17:30:49 | 显示全部楼层
顶一下啊,,,有时间来慢慢学习。。。
回复 赞! 靠!

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24235 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
 楼主| 发表于 2017-12-19 07:01:27 | 显示全部楼层
乘简 发表于 2017-12-18 17:30
顶一下啊,,,有时间来慢慢学习。。。


这句话一听就让人觉得没时间,而且是以后也不会再有时间的那种“没时间”。可以,这很咕咕。

点评

呵呵,就算没时间,至少也帮你顶了一下贴!~  发表于 2017-12-22 10:58
回复 赞! 靠!

使用道具 举报

15

主题

39

回帖

246

积分

用户组: 中·技术宅

UID
5832
精华
0
威望
2 点
宅币
188 个
贡献
0 次
宅之契约
0 份
在线时间
39 小时
注册时间
2020-4-15
发表于 2020-4-30 12:19:58 | 显示全部楼层
不知道哪里能找到编译器,有段x86的汇编代码,想改成arm汇编优化一下。
回复 赞! 靠!

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24235 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
 楼主| 发表于 2020-4-30 14:37:43 | 显示全部楼层
chaw899 发表于 2020-4-30 12:19
不知道哪里能找到编译器,有段x86的汇编代码,想改成arm汇编优化一下。

你把x86汇编“优化”成arm后,是要拿到手机上运行吗?
回复 赞! 靠!

使用道具 举报

15

主题

39

回帖

246

积分

用户组: 中·技术宅

UID
5832
精华
0
威望
2 点
宅币
188 个
贡献
0 次
宅之契约
0 份
在线时间
39 小时
注册时间
2020-4-15
发表于 2020-4-30 14:52:51 | 显示全部楼层
0xAA55 发表于 2020-4-30 14:37
你把x86汇编“优化”成arm后,是要拿到手机上运行吗?

是的,已经移植到手机上已经运行了。只是把汇编去掉了。
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 19:39 , Processed in 0.042858 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表