x86-64汇编操作数顺序咨询:目标在前还是源在前?
x86-64汇编操作数顺序:两种语法的区别
嘿,这个问题太常见了——毕竟x86-64汇编有两种主流语法体系,刚好对应你查到的两种不同表述,难怪会困惑!
Intel 语法(Windows/多数入门教材常用)
这种语法的操作数顺序是 「指令 目标, 源」,数据从“源”流向“目标”。比如经典的移动指令:
mov eax, ebx ; 把ebx寄存器的值,复制到eax寄存器中
目标寄存器eax写在前面,源ebx在后面,符合“把源的内容放到目标里”的直觉。绝大多数面向初学者的教材、Windows平台的汇编工具(比如MASM)都用这种语法。
AT&T 语法(Unix/Linux生态常用)
而在Unix/Linux环境中(比如GCC配套的汇编器gas),用的是AT&T语法,操作数顺序刚好反过来:「指令 源, 目标」。同样的移动操作,AT&T写法是:
movl %ebx, %eax ; 功能和上面完全一致,只是操作数顺序颠倒
这里还有两个明显特征:寄存器前要加%,指令后会带长度后缀(比如l代表32位长字),这些都是区分两种语法的快速标志。
为什么会有两种差异?
简单来说,Intel语法是英特尔官方定义的原生语法,而AT&T语法是当年贝尔实验室为适配Unix工具链,对Intel语法做的变体调整,后来就成为了类Unix系统的默认汇编语法。你看到的三本书出现两种表述,大概率是分别采用了这两种不同的语法体系。
下次遇到类似情况,只要看操作数前有没有%、指令有没有长度后缀,就能快速判断是哪种语法啦!
内容的提问来源于stack exchange,提问作者Josiah
相关产品推荐
相关产品推荐

