as
汇编器是苹果的汇编器,Xcode 生成的代码也是as
风格的,而as
风格与大部分人在大学里所学的微软的masm
风格大相径庭,所以本文会列出二者的不同。不过由于细节太多,没法一次性写出所有的不同,所以会持续更新。
你可能会找到一本手册名为《Mac OS X Assembler Guide》,但是这本手册出自 2005 年,是为了过度到 Intel 所写的。但是现在很多事情已经变了,现在的as
手册最近更新日期为 2020 年 4 月 23 日,也就是 M1 登场的日子。
寄存器表达方式
在masm
中,寄存器直接写,比如:
mov eax, ebx
但是在as
中,为了不与标识符(identifier,其实就是常说的变量)搞混,需要在寄存器前面加上百分号%
,并且必须小写。如下:
movq %rsp, %rbp
指令参数(最重要的区别)
这是最重要的一个区别!在masm
中,表示a=a+b
汇编指令如下:
add a, b
会将后者加到前者上。
但是在as
中,表示a=a+b
汇编指令是下面的结构:
add b, a
是直接按照顺序执行下去的。
指令中的数值
在masm
中,如果想将一个指令参数设置为数值,比如说10
,那么可以写成以下样式
mov a, 10
但是在as
中,要加上$
,如下:
mov $10, a
不过虽然麻烦,但是可以在后面加上括号来进行一些简单的计算,如下:
mov $(2*5), a
地址偏移量
在masm
中,如果想表示一个地址偏移量(很多情况下就是表示一个变量的地址),那么写法如下
mov eax, [ebp+8]
但是在as
中,写法为偏移量(基础寄存器, 下标寄存器, 缩放)
,看着很复杂,但是实际情况大多如下:
movl %edi, -4(%rbp)
十六进制写法
在masm
中,十六进制被写成以H或h结尾的,例如5c0dH
。但是在 as
中,需要写成0x开头的,例如0x1234
。