MOV 指令的数据流向

刚开始学汇编,MOV指令的操作数顺序把我整懵了。Intel文档写MOV R8, 42,GCC生成的汇编却是MOV $42, %rax。一个说"目标, 源",一个说"源, 目标",到底谁对谁错?其实两种都对,只是语法不同。这篇把MOV的数据流向彻底理清楚。


两种语法,完全相反的写法

语法 格式 示例 含义
Intel/NASM MOV 目标, 源 MOV R8, 42 把42存进R8
AT&T/GAS MOV 源, 目标 MOV $42, %rax 把42存进%rax

核心区别 :Intel把目标放前面,AT&T把目标放后面。但数据流向是一样的------都是从源到目标。


核心

不管用哪种汇编语法,MOV指令的核心作用只有一个:把源操作数(SRC)的值复制到目标操作数(DST) ,源操作数不会被修改,只有目标会变。

唯一的区别是:不同语法里,"源"和"目标"在指令里的位置不一样。

复制代码
; Intel: 目标 ← 源
MOV RAX, RBX      ; RAX = RBX,RBX不变

; AT&T: 源 → 目标(写法相反)
MOV %rbx, %rax    ; %rax = %rbx,%rbx不变

AT&T用%标记寄存器,$标记立即数,这是为了和C语言区分。Intel语法则更直白,直接写名字。


为什么会有两种语法

历史包袱

  • Intel语法:Intel自己定的标准,Windows环境、IDA反编译、大部分教材都用这个
  • AT&T语法 :Unix传统,GCC、GDB、Linux内核源码用这个,和C语言赋值方向相反(C是dst = src,AT&T是MOV src, dst

实际影响

  • 看Windows教程用Intel,看Linux内核用AT&T
  • 混着看容易精神分裂,建议先专精一种

常见坑

坑1:以为MOV是"移动"

MOV其实是复制,源操作数不会被清空。

复制代码
MOV RAX, RBX    ; 复制后RBX还在,不是剪切

坑2:AT&T的立即数和内存

复制代码
MOV $42, %rax       ; $42是立即数,存到rax
MOV 42, %rax        ; 没有$,42是内存地址,把地址42的内容读到rax
MOV %rax, 42        ; 把rax写到内存地址42(AT&T语法)

Intel语法反过来:

复制代码
MOV RAX, 42         ; 把42存到rax(立即数)
MOV RAX, [42]       ; 把地址42的内容读到rax(要加方括号)

坑3:操作数大小不明确

AT&T要在指令后加后缀:

复制代码
MOVB $1, %al        ; byte,8位
MOVW $1, %ax        ; word,16位
MOVL $1, %eax       ; long,32位
MOVQ $1, %rax       ; quad,64位

Intel靠寄存器名字区分,或者加BYTE PTR等修饰:

复制代码
MOV AL, 1           ; 8位
MOV AX, 1           ; 16位
MOV EAX, 1          ; 32位
MOV RAX, 1          ; 64位

快速对照表

操作 Intel AT&T
寄存器→寄存器 MOV RAX, RBX MOV %rbx, %rax
立即数→寄存器 MOV RAX, 42 MOV $42, %rax
内存→寄存器 MOV RAX, [RBX] MOV (%rbx), %rax
寄存器→内存 MOV [RBX], RAX MOV %rax, (%rbx)
立即数→内存 MOV QWORD PTR [RBX], 42 MOVQ $42, (%rbx)

一句话总结

MOV的数据永远从 流向目标 。Intel语法是MOV 目标, 源,AT&T是MOV 源, 目标,记住这个就不容易写反了。

建议新手从Intel语法入手,资料多、直观好懂。遇到AT&T代码时,心里默念"顺序反过来"就行。


相关推荐
weixin199701080161 天前
《中控网商品详情页前端性能优化实战》
前端·性能优化
gwjcloud1 天前
Frp内网穿透
linux·运维·服务器
bIo7lyA8v1 天前
如何用SSH访问远程服务器上的内网服务(如:MySQL、Redis、Kafka)?
服务器·mysql·ssh
小邓睡不饱耶1 天前
花店花品信息管理系统开发实战:Python实现简易门店管理系统
服务器·python·microsoft
white-persist1 天前
【vulhub weblogic CVE-2017-10271漏洞复现】vulhub weblogic CVE-2017-10271漏洞复现详细解析
java·运维·服务器·网络·数据库·算法·安全
TON_G-T1 天前
useEffect为什么会触发死循环
java·服务器·前端
tHeya06II1 天前
涵盖 Cursor、Claude Code、Skills
java·服务器
maosheng11461 天前
Linux的第二次作业
linux·运维·服务器
maosheng11461 天前
Linux
linux·运维·服务器
弹简特1 天前
【JavaSE-网络部分06】TCP 纯高性能优化机制:延迟应答・捎带应答【传输层】
网络·tcp/ip·性能优化·捎带应答·延迟应答