您现在的位置是:首页 >学无止境 >【更新中】苹果自家的as汇编器的特色风格(与wasm的不同)网站首页学无止境

【更新中】苹果自家的as汇编器的特色风格(与wasm的不同)

zhonguncle 2024-06-17 10:19:26
简介【更新中】苹果自家的as汇编器的特色风格(与wasm的不同)

as汇编器是苹果的汇编器,Xcode 生成的代码也是as风格的,而as风格与大部分人在大学里所学的微软的masm风格大相径庭,所以本文会列出二者的不同。不过由于细节太多,没法一次性写出所有的不同,所以会持续更新。

你可能会找到一本手册名为《Mac OS X Assembler Guide》,但是这本手册出自 2005 年,是为了过度到 Intel 所写的。但是现在很多事情已经变了,现在的as手册最近更新日期为 2020 年 4 月 23 日,也就是 M1 登场的日子。

现在的as手册最近更新日期为2020年4月23日

寄存器表达方式

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。