苹果自家的as汇编器的特色风格(与微软masm汇编器语言风格的不同)

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

你可能会找到一本手册名为《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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值