一、汇编中指令和伪指令的区别?

指令:机器码助记符,每条指令会生成机器码,由CPU读取执行。
伪指令(伪操作):没有与之对应的机器码,非可执行指令,需要汇编器来解释。

二、OS X 伪指令:

所有汇编程序伪指令(GUN汇编器通用伪指令)的名称都是以‘.’开头。名称大多数不区分大小写,通常使用小写字母表示。

1、定义数据伪指令(下面数据类型空间大小为arm64下的size)

1
2
3
4
5
6
7
8

.byte // 定义1个字节大小的变量
.short // 定义2个字节大小的变量
.int // 定义4个字节大小的变量
.long // 定义8个字节大小的变量
.quad(大数) // 定义8个字节大小的变量
.ascii // 定义字符串以非零结束,行尾需要添加’\0’
.asciz // 定义字符串以零结束

2、汇编控制
(1)条件判断伪指令:

1
2
3
4

.if /* 条件判断开始 */
.else
.endif /* 条件判断结束 */

(2)宏定义伪指令:

1
2
3

.macro 宏名 /* 宏定义开始 */
.endmacro /* 宏定义结束 */

3、定义一个section
Mach-O文件中的数据或指令都是存在segment中(可通过MachOView
查看),一个segment由零个或者多个section组成,segment 名称用双下划线开头 +全字母大写(例如:DATA)表示,section名称用双下划线开头+全字母小写(例如:data)表示

1
2
3
4
5
6
7
8

.section segname , sectname [[[ , type ] , attribute ] , sizeof_stub ]

示例:
.section __DATA __data // 等价于 .data
.section __TEXT __text // 等价于 .text
.section __TEXT __const // 等价于 .const
.section __TEXT,__cstring, cstring_literals // 等价于 .cstring

更多内容详见文章末尾参考资料:OS X Assembler Directives

4、对齐align
用fill_expression(指定,则必须是绝对的,未指定,则为零)使当前位置与align_expression边界对齐 。align_expression是介于0到15之间2的幂(例如:.align 3意味着2 ^ 3(8)字节对齐)。

1
2
3
4
.align align_expression [,1byte_fill_expression [,max_bytes_to_fill]]

示例:
.align 3 // 相当于2 ^ 3(8)字节对齐

5、填充fill
重复拷贝指定字节,重复repeat_expression次,repeat_expression必须是大于0的绝对表达式,fill_size以字节为单位且必须有值,值可以为1,2,4或者8。fill_expression可以是任何绝对表达式(它会被截断为填充大小)。

1
2
3
4
5

.fill repeat_expression,fill_size,fill_expression

示例:
.fill 16, 1, 0

6、私有外部符号private_extern
.private_extern可以把symbol_name变成私有外部符号。当链接编辑器将此模块与其他模块组合在一起(且keep_private_externs 命令行选项未指定)时,该符号会将它从全局更改为静态。如果在同一符号上同时使用了.private_extern和.globl汇编程序指令,则和只使用 .private_extern 效果一样。

1
2
3
4
5

.private_extern symbol_name

示例
.private_extern _objc_restartableRanges

7、标签
标签是用来标记程序和数据对象的位置的标识符,每个标签由一个标识符和一个终止冒号组成,标识符中的字母区分大小写,格式如下:

1
2
3
4
5

identifier: [ identifier: ] ...

示例:
L_method_invoke_small:

8、其他伪指令

1
2
3
4
5
6
7

.abort // 使汇编器忽略进一步的输入并退出处理
.text // 表示代码段
.data // 表示数据段
.globl // 声明为全局符号
.include // 引入头文件
.set // 把符号定义成一个表达式,相当于 symbol_name=absolute_expression

三、注释风格:

1、特定平台单行注释:x86-64使用#开头,arm使用;开头

1
2
3

add x10, x10, #0x1 # This a comment line 注释代码:x86-64
add x10, x10, #0x1 ; This a comment line 注释代码:arm

2、GNU通用语法
(1)多行注释

1
2
3
4

/*
注释代码
*/

(2)单行注释

1
2

MOV R1,#15 // Load R1 with 15

四、寄存器

典型的CPU主要组成部分:运算器、控制器、寄存器。
寄存器是CPU用来暂存指令、数据、地址的电脑存储器。它的存储容量有限,是CPU中最快的可读写存储器。

1、ARM64中常见寄存器

完整优秀版请移步小专栏:
iOS汇编入门必备(指令篇)

更多好文推荐,扫描下方的二维码,关注《iOS开发秘籍》公众号,免费解锁完整版
iOS开发秘籍

本文内容中部分来自网络,后续会持续更新完善。欢迎一起学习交流!

如需转载,请注明出处

iOS汇编入门必备(指令篇)