一、汇编中指令和伪指令的区别?
指令:机器码助记符,每条指令会生成机器码,由CPU读取执行。
伪指令(伪操作):没有与之对应的机器码,非可执行指令,需要汇编器来解释。
二、OS X 伪指令:
所有汇编程序伪指令(GUN汇编器通用伪指令)的名称都是以‘.’开头。名称大多数不区分大小写,通常使用小写字母表示。
1、定义数据伪指令(下面数据类型空间大小为arm64下的size)
.byte // 定义1个字节大小的变量
.short // 定义2个字节大小的变量
.int // 定义4个字节大小的变量
.long // 定义8个字节大小的变量
.quad(大数) // 定义8个字节大小的变量
.ascii // 定义字符串以非零结束,行尾需要添加’\0’
.asciz // 定义字符串以零结束
2、汇编控制
(1)条件判断伪指令:
.if /* 条件判断开始 */
.else
.endif /* 条件判断结束 */
(2)宏定义伪指令:
.macro 宏名 /* 宏定义开始 */
.endmacro /* 宏定义结束 */
3、定义一个section
Mach-O文件中的数据或指令都是存在segment中(可通过MachOView
查看),一个segment由零个或者多个section组成,segment 名称用双下划线开头 +全字母大写(例如:__DATA)表示,section名称用双下划线开头+全字母小写(例如:__data)表示
.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(指定,则必须是绝对