iOS汇编入门必备(指令篇)
一、汇编中指令和伪指令的区别?
指令:机器码助记符,每条指令会生成机器码,由CPU读取执行。
伪指令(伪操作):没有与之对应的机器码,非可执行指令,需要汇编器来解释。
二、OS X 伪指令:
所有汇编程序伪指令(GUN汇编器通用伪指令)的名称都是以‘.’开头。名称大多数不区分大小写,通常使用小写字母表示。
1、定义数据伪指令(下面数据类型空间大小为arm64下的size)
1 |
|
2、汇编控制
(1)条件判断伪指令:
1 |
|
(2)宏定义伪指令:
1 |
|
3、定义一个section
Mach-O文件中的数据或指令都是存在segment中(可通过MachOView
查看),一个segment由零个或者多个section组成,segment 名称用双下划线开头 +全字母大写(例如:DATA)表示,section名称用双下划线开头+全字母小写(例如:data)表示
1 |
|
更多内容详见文章末尾参考资料:OS X Assembler Directives
4、对齐align
用fill_expression(指定,则必须是绝对的,未指定,则为零)使当前位置与align_expression边界对齐 。align_expression是介于0到15之间2的幂(例如:.align 3意味着2 ^ 3(8)字节对齐)。
1 | .align align_expression [,1byte_fill_expression [,max_bytes_to_fill]] |
5、填充fill
重复拷贝指定字节,重复repeat_expression次,repeat_expression必须是大于0的绝对表达式,fill_size以字节为单位且必须有值,值可以为1,2,4或者8。fill_expression可以是任何绝对表达式(它会被截断为填充大小)。
1 |
|
6、私有外部符号private_extern
.private_extern可以把symbol_name变成私有外部符号。当链接编辑器将此模块与其他模块组合在一起(且keep_private_externs 命令行选项未指定)时,该符号会将它从全局更改为静态。如果在同一符号上同时使用了.private_extern和.globl汇编程序指令,则和只使用 .private_extern 效果一样。
1 |
|
7、标签
标签是用来标记程序和数据对象的位置的标识符,每个标签由一个标识符和一个终止冒号组成,标识符中的字母区分大小写,格式如下:
1 |
|
8、其他伪指令
1 |
|
三、注释风格:
1、特定平台单行注释:x86-64使用#
开头,arm使用;
开头
1 |
|
2、GNU通用语法
(1)多行注释
1 |
|
(2)单行注释
1 |
|
四、寄存器
典型的CPU主要组成部分:运算器、控制器、寄存器。
寄存器是CPU用来暂存指令、数据、地址的电脑存储器。它的存储容量有限,是CPU中最快的可读写存储器。
1、ARM64中常见寄存器
完整优秀版请移步小专栏:
iOS汇编入门必备(指令篇)
更多好文推荐,扫描下方的二维码,关注《iOS开发秘籍》公众号,免费解锁完整版
本文内容中部分来自网络,后续会持续更新完善。欢迎一起学习交流!
如需转载,请注明出处